为什么不引人注意的验证在不使用@ Html.BeginForm()的情况下不能在asp.net mvc3中工作

时间:2012-12-20 09:39:00

标签: asp.net-mvc-3 unobtrusive-validation

要在asp.net mvc3中进行不显眼的验证工作,你必须使用这篇非常好的帖子中提到的html助手@Html.BeginForm()http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

不使用帮助程序不会触发不显眼的验证。我可以验证一下。

您能否解释一下帮助@Html.BeginForm()做什么以便在提交表单时触发不引人注目的验证?

你能解释一下我怎样才能手动执行此操作(读取允许不引人注目的验证而不调用@Html.BeginForm())?

请注意,我知道我可以使用$("#myform").valid()调用不引人注目的验证,但我想知道帮助程序背后的魔力以及如何重现它。

2 个答案:

答案 0 :(得分:2)

在您的视图中写下它,它将起作用:

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

当代码在@Html.Beginform内(在同一视图中)时,则从元数据中获取html元素验证属性,而在其他情况下,则不是。

答案 1 :(得分:2)

当您致电BeginForm时(请FormExtensionsclass查看MvcForm),即会创建一个新的FormContext对象。

如果您查看此类的构造函数(请参阅http://j.mp/WrmAyk了解MvcForm类),您将看到它创建了一个新的_viewContext.FormContext = new FormContext();对象:tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));

当使用HTML帮助器呈现input,textarea或select时,会调用以下内容:GetUnobtrusiveValidationAttributes,它负责从模型元数据中呈现验证属性。

FormContext formContext = ViewContext.GetFormContextForClientValidation(); if (formContext == null) { return results; } 方法(请参阅HtmlHelper类的http://j.mp/Wrml6F)检查在呈现属性之前FormContext是否为null:

FormContext

这就是为什么除非您在表单中,否则不会呈现验证属性。你可以通过创建一个'假'{{1}}来解决这个问题,就像@karaxuna建议的那样。