1

我的问题有点类似这个问题Custom Validation on group of checkboxes“必要”数据标注不工作的一组复选框的

我有一组复选框在视图(New.cshtml),其使用呈现“ParentObject”作为视图模型

ParentObject.cs: -

public class ParentObject 
{ 

    [Required] 
    public IEnumerable<RegionObject> Regions { get; set; } 

} 

New.cshtml: -

@model ParentObject 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()){ 
@Html.LabelFor(model => model.Regions) 
@Html.EditorFor(model => model.Regions) 
@Html.ValidationMessageFor(model => model.Regions) 
<input type="submit" title="Create new parent object" class="button btn67" value="Create" /> 
} 

的地区编辑模板位于\查看\共享\ EditorTemplates \ RegionObject.cshtml 是这样

@model RegionObject 
<p> 
@Html.CheckBoxFor(m => m.IsChecked) 
@Html.HiddenFor(m => m.Code) 
@Html.DisplayFor(m => m.Name) 
</p> 

的RegionObject视图模型是:

public class RegionObject 
{ 
    public Guid Code { get; set; } 
    public string Name { get; set; } 
    public bool IsChecked { get; set; } 
} 

为什么是 '必要' “Regions”上的数据注解不起作用?我想确保至少有一个复选框是针对区域选择的。我会认为'必需的'会做这项工作,但显然不是。我是否需要编写一个自定义验证器来完成这项工作?

谢谢。

回答

1

必要属性无法在集合上进行操作,因为您可能希望。另外你如何期望它知道至少有一个复选框需要从这个RegionObject自定义类中选择?您如何期望它与此集合中的IsChecked属性相关?

我是否需要编写自定义验证器才能使其工作?

是的,您需要一个自定义验证属性来实现该属性。例如:

public class AtLeastOneRegionMustBeCheckedAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var instance = value as IEnumerable<RegionObject>; 
     if (instance != null) 
     { 
      return instance.Where(x => x.IsChecked).Count() > 0; 
     } 
     return base.IsValid(value); 
    }  
} 

然后:

public class ParentObject 
{ 
    [AtLeastOneRegionMustBeChecked(ErrorMessage = "Please select at least one region")] 
    public IEnumerable<RegionObject> Regions { get; set; } 
} 
+0

这正是我一直在问我自己来怎么会明白选择,包括至少一个区域的业务规则。我花时间使用自我验证模型进行这项工作,并且使用自定义验证属性对我来说不会发生。谢谢你的帮助。 – Reee