1

我的问题有点类似于这个问题Custom Validation on group of checkboxes

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

ParentObject.cs :-

public class ParentObject
{

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

}

新的.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; }
}

为什么“区域”上的“必需”数据注释不起作用?我想确保针对区域选择了至少 1 个复选框。我原以为“必需”可以完成这项工作,但显然不是。我需要编写一个自定义验证器来完成这项工作吗?

谢谢。

4

1 回答 1

2

Required 属性不能像您希望的那样对集合进行操作。另外,您如何期望它知道需要从此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; }
}
于 2011-09-05T18:57:19.927 回答