我的问题有点类似于这个问题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个复选框。我原本以为'必需'会做这个工作,但显然不是。我是否需要编写自定义验证器才能使其正常工作?
感谢。
答案 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; }
}