2012-12-20 57 views
2

爲什麼不引人注目的驗證不會在asp.net mvc3中工作要在asp.net mvc3中做出不引人注意的驗證工作,您必須使用html幫手@Html.BeginForm(),正如在這篇非常好的文章中提到的:http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html不使用@ Html.BeginForm()

不使用助手不顯眼的驗證不會被觸發。我可以驗證。

您能否解釋一下幫手@Html.BeginForm()做什麼來允許在提交表單時觸發不顯眼的驗證?

你也可以解釋我怎麼能手動做到這一點(讀取允許不顯眼的驗證,而不需要調用@Html.BeginForm())?

請注意,我知道我可以使用$("#myform").valid()調用不顯眼的驗證,但我想知道助手的魔法以及如何重現它。

回答

2

當您致電BeginForm(請參閱http://j.mp/WrmAyk中的FormExtensionsclass)時,會創建一個新的MvcForm對象。

如果您查看此類的構造函數(請參閱http://j.mp/Wrml6F MvcForm類),您將看到它會創建一個新的FormContext對象:_viewContext.FormContext = new FormContext();

當使用HTML助手呈現input,textarea或select時,將調用以下內容:tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));,它負責從模型元數據呈現驗證屬性。

GetUnobtrusiveValidationAttributes方法(見http://j.mp/Wrn4oa爲HtmlHelper類)檢查,看是否FormContext是空渲染屬性之前:

FormContext formContext = ViewContext.GetFormContextForClientValidation(); 
if (formContext == null) 
{ 
    return results; 
} 

這就是爲什麼沒有驗證屬性被渲染,除非你是一個表單中。你可以通過創建一個'假'FormContext來解決這個問題,就像@karaxuna所建議的那樣。

+0

感謝您的回答和很好的解釋! –

2

寫在你看來,它會工作:

ViewContext.FormContext = ViewContext.FormContext ?? new FormContext(); 

當代碼裏面@ Html.Beginform(在同一視圖),然後HTML元素的驗證屬性是從元數據得到的,在其他情況下,不是這樣。

+0

+1爲偉大的答案thx! –

+0

歡迎您:) – karaxuna