2013-06-02 71 views
4

我有一个问题,基本上我有一个有很多字段的表单,并且它们都具有必需的属性集,所以当您将它留空并单击确定,你会得到客户端验证,并且它变成红色。它对所有exept EditorTemplate都适用。MVC3编辑器模板不会生成客户端验证

我的模型如下:

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> 

...

调查完毕后NG它thouroughtly我注意到,HTML它prodcues是以下几点:

<select name="Location.Loc1" id="Location_Loc1"> 

正如你可以看到它缺少对客户端验证某些属性,通常它应该是这样的:

<select name="Loc1" id="Loc1" data-val-required="The Loc1field is required." data-val="true"> 

我的问题是,为什么编辑器模板不能通过客户端验证生成正确的html输出,以及如何修复它?

只是为了说明它确实在服务器端工作,所以如果这些选择在服务器端是空的,它将被标记为未被填充并被发回。但是,我仍想了解editorform的行为和解决方法。

感谢

+1

客户端验证是否适用于'UserName'属性? – Shyju

+0

是的,它确实有效! – Alnedru

+0

没有人真的遇到过这种问题吗? – Alnedru

回答

1

您可以使用Html.GetUnobtrusiveValidationAttributes("Location.Loc1")获得验证特性。 查看文档here

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> 

PS Html.NameFor()出现在MVC4中,但您可以使用反射获取物业名称。