为什么不引人注目的验证在不使用 @html.beginform()的情况下无法在ASP.NET MVC3中使用



要使在ASP.NET MVC3中进行不引人注目的验证工作,您必须使用此非常好的帖子中提到的HTML助手@Html.BeginForm():http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html。

不使用助手不引人注目的验证将不会触发。我可以验证。

您可以向我解释一下助手@Html.BeginForm()在提交表单时允许触发不引人注目的验证吗?

您还可以向我解释一下我该如何手动执行操作(阅读允许不引人注目的验证而无需调用@Html.BeginForm())?

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

呼叫BeginForm(请参阅http://j.mp/wrmayk for FormExtensionsclass),创建了一个新的MvcForm对象。

如果您查看此类的构造函数(请参阅MVCForm类的http://j.mp/wrml6f),您将看到它创建一个新的FormContext对象:_viewContext.FormContext = new FormContext();

使用HTML助手渲染输入,文本方面或选择时,以下称为:tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));,它照顾从模型元数据呈现验证属性。

GetUnobtrusiveValidationAttributes方法(有关htmlhelper类,请参见http://j.mp/wrn4oa)检查以查看formContext在呈现之前是否为null,然后渲染属性:

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

这就是为什么除非您处于形式之内,否则不会呈现验证属性的原因。您可以通过创建"伪造" FormContext来解决这个问题,例如@karaxuna建议。

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

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

当代码在 @html.beginform内部(在同一视图中)时,html元素验证属性是从元数据中获得的,在其他情况下,它不是。

相关内容

最新更新