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标签
答案 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