2012-02-28 3 views
10

私は、動的に作成された項目に対して控えめなjavascript検証を有効にしようとしています。 javascriptの問題はすでに別のSOの質問で解決されていますが、ここではそうではありません。ASP.NET MVC邪魔されない検証 - なぜフォームコンテキストが必要ですか?

この場合のアイテムの動的作成は、メインフォームの外部で生成された1つの空のアイテムのクローン作成だけです。

TextBoxFor、CheckBoxForなどのhtmlヘルパーを使用すると、htmlフォーム要素の外側で検証が機能するために必要な属性(例:data-val-required)が生成されないという問題があります。

私はすでにMVCソースコードをチェックしていて、FormContextがnullの場合は空の属性リストを返す行があります。 (例外はありません)

なぜですか?

答えて

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-*属性を保有します。しかしそれでは不十分かもしれません。あなただけが<form>の一部をリフレッシュ(AJAXを使用)しているのに、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

+0

おい...これの周りのすべてのレシピを使用して数時間後、魅力的に働いた。ありがとう! – Romias

+0

その他の背景情報:http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html – Jowen

関連する問題