我有一个问题,基本上我有一个包含大量字段的表单,并且所有字段都设置了必需的属性,因此当您将其留空并单击“确定”时,您将获得客户端验证并且它变为红色。它对于管理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输出,以及如何修复它?
只是注意它确实在服务器端工作,所以如果这些选择在服务器端是空的,它将被标记为未填写并发回。但是,我仍然想了解编辑器的行为以及修复它的方法。
由于
答案 0 :(得分:1)
您可以使用Html.GetUnobtrusiveValidationAttributes("Location.Loc1")
获取验证属性。
请参阅文档here。
答案 1 :(得分:0)
我认为应该更详细地解释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>
P.S。 Html.NameFor()
出现在MVC4中,但您可以使用 Reflection 获取属性的名称。