2012-02-28 70 views
10

我試圖爲動態創建的項目啓用不顯眼的JavaScript驗證。 JavaScript的問題已經在另一個SO問題中得到解決,而這不是這種情況。ASP.NET MVC Unobtrusive驗證 - 爲什麼需要表單上下文?

在這種情況下動態創建項目只是克隆在主窗體外部生成的一個空項目。

問題是,如果我使用HTML表單元素之外的HTML助手(如TextBoxFor,CheckBoxFor ...),則不會生成驗證工作所需的屬性(例如,data-val-required)。

我已經檢查過MVC源代碼,並且有一行返回空屬性列表,如果FormContext爲空。 (這不會引發例外)

爲什麼?

回答

20

你可以手動僞造一個表單上下文。例如,如果你有不包含<form>元素,這是使用AJAX來重新生成一些輸入元素,你可以做到這一點叫一些局部視圖:

@model MyViewModel 
@{ 
    ViewContext.FormContext = new FormContext(); 
} 

@Html.LabelFor(x => x.Foo) 
@Html.EditorFor(x => x.Foo) 
@Html.ValidationMessageFor(x => x.Foo) 

相應的輸入元素現在它們所具有的data-*屬性。但這可能還不夠。如果只刷新(使用AJAX),只有<form>的一部分,但實際上並未替換DOM調用$.validator.unobtrusive.parse中的表單元素是不夠的。您需要刪除任何以前與此元素相關的驗證:

success: function(result) { 
    // we are replacing only a portion of the form 
    $('#somePartOfTheForm').html(result); 

    $('form').removeData('validator'); 
    $('form').removeData('unobtrusiveValidation'); 
    $.validator.unobtrusive.parse('form'); 
} 
+3

此答案應被接受! – Marko 2012-04-03 05:46:17

+0

老兄...在使用所有的收件人之後的幾個小時,就像一個魅力。謝謝! – Romias 2012-04-22 13:59:52

+0

更多背景信息:http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html – Jowen 2013-05-10 18:49:20