Asp.Net Mvc 3客户端验证,属性生成

时间:2011-07-11 22:53:24

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

Asp.net Mvc3在输入元素上广告一些自定义属性,如“data-val-required”,以执行验证。我知道这背后的所有理论,它是如何运作的。

我想知道的是:

当我在“@using(Html.BeginForm())”中创建表单时,它会生成自定义属性,但是当我将表单放在普通的“<form>”标记之间时,它不会创建这些属性。 / p>

下面是我创建的演示,用于演示我所说的内容

Razor Code,在BefingForm()内部形成

 @using (Html.BeginForm()) {
                @Html.EditorFor(model => model.EmailAddress)
                @Html.ValidationMessageFor(model => model.EmailAddress)
}

生成的Html 包含“data-val-required”作为如下所示的属性

<input type="text" value=""  data-val-required="The Email Address field is required."  data-val-email="my message">

纯Html标记内的Razor代码表单

<form action="/Account/Register" method="post">
            @Html.EditorFor(model => model.EmailAddress)
            @Html.ValidationMessageFor(model => model.EmailAddress)
</form>

生成的Html 不包含“data-val-required”属性,如下所示

<input type="text" value=""  gtbfieldid="44">

我的问题是我怎么能要求MVC添加这些属性,即使表单放在一边纯粹的html标签

2 个答案:

答案 0 :(得分:5)

我相信BeginForm方法在内部将一个formcontext对象分配给viewCotnext的属性FormContext。如果您不想使用普通的html表单标签,则必须手动执行此操作,如

<%
    this.ViewContext.FormContext = new FormContext();
%>

在剃刀中它可能是

@{
    this.ViewContext.FormContext = new FormContext();
}

答案 1 :(得分:5)

问题在于内部Html.BeginForm由Html.EnableClientValidation()标记,以创建将存储客户端验证元数据的FormContext。现在,任何呈现验证消息的HTML帮助器方法也会在FormContext中注册适当的客户端验证元数据。结果就是你使用帮助器时得到的结果。但是,如果您尝试使用HTML语法而不是帮助程序,则FormContext永远不会注册,因此永远不会添加您的验证。

此致

Huske