4

我有一个问题,基本上我有一个包含很多字段的表单,并且所有字段都有一个必需的属性集,所以当您将其留空并单击“确定”时,您将获得客户端验证并变为红色。它适用于除 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)

这是我的编辑器模板:

<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 输出,以及如何修复它?

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

谢谢

4

2 回答 2

1

您可以使用Html.GetUnobtrusiveValidationAttributes("Location.Loc1")来获取验证属性。请参阅此处的文档。

于 2016-03-25T11:49:59.130 回答
0

我认为Html.GetUnobtrusiveValidationAttributes()应该更详细地解释的用法。

假设您的 Editor Template 模型是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>

PSHtml.NameFor()出现在 MVC4 中,但您可以使用Reflection获取属性的名称。

于 2017-05-03T08:04:50.993 回答