MVC3编辑器模板不生成客户端验证
本文关键字:客户端 验证 编辑器 MVC3 | 更新日期: 2023-09-27 18:16:33
我有一个问题,基本上我有一个表单有很多字段在里面,他们都有一个必需的属性集,所以当你只是离开它空,点击确定,你得到客户端验证,它变成了红色。除了EditorTemplate,其他都可以。
我的模型如下:
public class MyModel
{
[Required]
public string Username{get;set;}
public Location Loc{get;set;}
}
public class Location
{
[Required]
public string Loc1{get;set;}
[Required]
public string Loc2{get;set;}
}
我的主要观点如下:
@Html.EditorFor(m => m.Location, Model.Location)
这是我的EditorTemplate:
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.Loc1)
</td>
<td class="editor-field">
@Html.DropDownListFor(m => m.Loc1, Model.Locs==null?Enumerable.Empty<SelectListItem>():Model.Locs, "---select--", new { @class = "location-ddl" })
</td>
<td>
@Html.ValidationMessageFor(m => m.Loc1)
</td>
</tr>
…
仔细研究后,我注意到它产生的HTML如下:
<select name="Location.Loc1" id="Location_Loc1">
可以看到,它缺少一些用于客户端验证的属性,通常应该是这样的:
<select name="Loc1" id="Loc1" data-val-required="The Loc1field is required." data-val="true">
我的问题是,为什么编辑器模板不能在客户端验证生成正确的html输出,以及如何修复它?
只是一个注意,它确实工作服务器端,所以如果那些选择是空的服务器端,它将被标记为未填写并发送回来。但是,我仍然想了解editorform的行为和修复它的方法。
谢谢
可以使用Html.GetUnobtrusiveValidationAttributes("Location.Loc1")
获取验证属性。
我认为应该更详细地解释Html.GetUnobtrusiveValidationAttributes()
的用法。
假设你的编辑器模板模型是Location
,你必须在文件的顶部添加以下代码块:
@{
IDictionary<string, Object> htmlAttributeValuePairsLoc1 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString());
htmlAttributeValuePairsLoc1.Add("class","location-ddl");
IDictionary<string, Object> htmlAttributeValuePairsLoc2 = Html.GetUnobtrusiveValidationAttributes(Html.NameFor(m=>m.Loc1).ToHtmlString());
htmlAttributeValuePairsLoc2.Add("class","location-ddl");
}
现在你可以把相应的字典注入到你的HtmlHelpers中,如下所示:<tr>
<td class="editor-label">
@Html.LabelFor(m => m.Loc1)
</td>
<td class="editor-field">
@Html.DropDownListFor(m => m.Loc1,
Model.Locs??Enumerable.Empty<SelectListItem>(),
"---select--",
htmlAttributeValuePairsLoc1)
</td>
<td>
@Html.ValidationMessageFor(m => m.Loc1)
</td>
</tr>
注:Html.NameFor()
出现在MVC4中,但您可以使用Reflection获取属性名称。