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

时间:2013-06-02 16:13:57

标签: c# asp.net-mvc-3 model editorfor editortemplates

我有一个问题,基本上我有一个包含大量字段的表单,并且所有字段都设置了必需的属性,因此当您将其留空并单击“确定”时,您将获得客户端验证并且它变为红色。它对于管理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输出,以及如何修复它?

只是注意它确实在服务器端工作,所以如果这些选择在服务器端是空的,它将被标记为未填写并发回。但是,我仍然想了解编辑器的行为以及修复它的方法。

由于

2 个答案:

答案 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 获取属性的名称。