我知道這種問題已經解決了很多次,但是我無法根據提供的解決方案獲得我的固定。MVC - jQuery驗證不適用於動態添加的元素
我正在構建一個簡單的庫應用程序。有一個功能可以添加一本書的副本,該書使用jQuery來調用控制器操作並返回部分視圖,然後將動態添加到DOM中。
添加的最後一個動態元素是一個表單,其中包含創建副本的其他詳細信息。當DropDownList
(#AuthorBooksDropDown
)(也是動態添加的)值發生更改時,將觸發ajax調用。
$('#authorBooksPlaceHolder').on('change', '#AuthorBooksDropDown', function() {
var bookId = $(this).val();
$.get('/Books/AddCopy_RenderDetails/' + bookId, function (data) {
$('#bookDetailsPlaceHolder').html(data);
$('#bookDetailsPlaceHolder').slideDown();
});
$.validator.unobtrusive.parse('#addCopyForm');
});
的調用來調用AddCopy_RenderDetails
行動基於本書id
從數據庫得到一個實體,並創建填充某些領域的新副本。
控制器動作:
public PartialViewResult AddCopy_RenderDetails(int id)
{
var book = db.LibraryBooks.Find(id);
var newCopy = new Book()
{
Author = book.Author,
Title = book.Title,
Publisher = book.Publisher,
CollectionId = book.CollectionId,
Collection = book.Collection
};
return PartialView("_AddCopy_Details", newCopy);
}
剩餘需要被填充的字段中的視圖顯示。
@model CityLibrary.Models.Library.Book
<div class="vertical-separator"></div>
<hr />
@using (Ajax.BeginForm("AddCopy", "Books", new AjaxOptions
{
UpdateTargetId = "bookDetailsPlaceHolder"
}, new { @id = "addCopyForm" }))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.Author)
@Html.HiddenFor(model => model.Title)
@Html.HiddenFor(model => model.CollectionId)
@Html.HiddenFor(model => model.Collection.Name)
@Html.HiddenFor(model => model.Publisher)
<div class="form-group">
@Html.LabelFor(model => model.Collection.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Collection.Name, new { htmlAttributes = new { @class = "form-control", @disabled = "" } })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ISBN, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.ISBN, new { htmlAttributes = new { @class = "form-control", } })
@Html.ValidationMessageFor(model => model.ISBN, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Publisher, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Publisher, new { htmlAttributes = new { @class = "form-control", @disabled = "disabled" } })
@Html.ValidationMessageFor(model => model.Publisher, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.YearPrinted, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.YearPrinted, new { htmlAttributes = new { @class = "form-control", @Value = "" } })
@Html.ValidationMessageFor(model => model.YearPrinted, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-success btn-block" />
</div>
</div>
}
即使我有$.validator.unobtrusive.parse('#addCopyForm');
時的形式呈現(在Chrome瀏覽器開發工具選中),確認仍然在服務器端在按壓提交按鈕作爲POST操作被觸發,每次發生調用。更不用說驗證錯誤不會顯示在下一個字段的TAB中。
驗證屬性是有形式的輸入:
我也有一個檢查輸入ISBN是否已經在數據庫的遠程驗證。很顯然,這在客戶端運行,在我的情況下根本沒有。
謝謝你的時間和幫助。
編輯:
嗯,我已經添加了以下到視圖的末尾:
<script>
$.validator.unobtrusive.parse('#addCopyForm');
</script>
和它的作品。我不知道爲什麼在一個函數上觸發它什麼都不做。
只是一個提醒這個和平,檢查是否#authorBooksPlaceHolder已經存在的觀點,而不是動態填充。 – Shashi
謝謝你的回答。 '#authorBooksPlaceHolder'是一個靜態div,最初使用'display:none'。 – Dandry