“必需”数据注释不适用于一组复选框

时间:2011-09-05 16:22:10

标签: asp.net-mvc asp.net-mvc-3 razor validation mvc-editor-templates

我的问题有点类似于这个问题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" />
}

区域的编辑器模板位于\ Views \ Shared \ 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'上的'Required'数据注释不起作用?我想确保对区域选中至少1个复选框。我原本以为'必需'会做这个工作,但显然不是。我是否需要编写自定义验证器才能使其正常工作?

感谢。

1 个答案:

答案 0 :(得分: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; }
}