2

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

不使用帮助器不会触发不显眼的验证。我可以验证这一点。

您能解释一下帮助@Html.BeginForm()程序在提交表单时如何允许触发不显眼的验证吗?

你能解释一下我怎么能手动做到这一点(阅读允许不显眼的验证而不调用@Html.BeginForm())?

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

4

2 回答 2

2

当您调用时BeginForm(请参阅http://j.mp/WrmAykFormExtensionsclass),将创建一个新MvcForm对象。

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

当使用 HTML 帮助器呈现输入、文本区域或选择时,将调用以下内容:tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));,它负责呈现模型元数据中的验证属性。

GetUnobtrusiveValidationAttributes方法(参见http://j.mp/Wrn4oa的 HtmlHelper 类)在呈现属性之前检查 FormContext 是否为空:

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

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

于 2012-12-20T12:46:38.237 回答
2

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

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

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

于 2012-12-20T10:51:40.737 回答