2016-05-23 105 views
0

我知道這種問題已經解決了很多次,但是我無法根據提供的解決方案獲得我的固定。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中。

驗證屬性是有形式的輸入:

enter image description here

我也有一個檢查輸入ISBN是否已經在數據庫的遠程驗證。很顯然,這在客戶端運行,在我的情況下根本沒有。

謝謝你的時間和幫助。

編輯:

嗯,我已經添加了以下到視圖的末尾:

<script> 
    $.validator.unobtrusive.parse('#addCopyForm'); 
</script> 

和它的作品。我不知道爲什麼在一個函數上觸發它什麼都不做。

+0

只是一個提醒這個和平,檢查是否#authorBooksPlaceHolder已經存在的觀點,而不是動態填充。 – Shashi

+0

謝謝你的回答。 '#authorBooksPlaceHolder'是一個靜態div,最初使用'display:none'。 – Dandry

回答

1

Ajax是異步的,並且您的$.validator.unobtrusive.parse('#addCopyForm');代碼行在HTML添加到DOM之前被調用。它移動到success回調

$.get('/Books/AddCopy_RenderDetails/' + bookId, function (data) { 
    $('#bookDetailsPlaceHolder').html(data); 
    $('#bookDetailsPlaceHolder').slideDown(); 
    $.validator.unobtrusive.parse('#addCopyForm'); 
}); 
+0

謝謝先生,它解決了這個問題。你能告訴我爲什麼在'$ .get(...)'的右括號之後加上'$ .validator.unobtrusive.parse('#addCopyForm');'不起作用嗎?爲什麼它之前被調用,即使它被放置在'通話'之後? – Dandry

+1

Ajax是異步的。這意味着在代碼的其餘部分繼續執行時運行它,所以在'$ .get()'方法有機會從控制器獲取部分視圖之前,'$ .validator.unobtrusive.parse( '#addCopyForm');'命中一行代碼(但是這個時候還沒有添加html)。 –

+0

非常感謝! – Dandry

1

內嘗試的代碼

$("form").on("submit", function (e) { 
      e.preventDefault(); 
      $.validator.unobtrusive.parse($('#addCopyForm')); // here you need define your form id 
      if ($(this).valid()) // use to validate the form 
        { 
       //do ajax call 
       $.ajax({ 
        type: "Post", 
        url: "/Books/AddCopy_RenderDetails/" + bookId, 
        contentType: "application/json; charset=utf-8",       
        dataType: "json", 
        success: function (data) {       
        } 
       }); 
      } 
     }); 
+0

謝謝,但我使用'Ajax.BeginForm'節省了我插入所有這些代碼。無論如何,這是完成它的另一種方式。 – Dandry