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的行为和修复它的方法。

谢谢

MVC3编辑器模板不生成客户端验证

可以使用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获取属性名称。