【问题标题】:'Required' Data annotation not working on a group of checkboxes“必需”数据注释不适用于一组复选框
【发布时间】:2011-09-05 16:22:09
【问题描述】:

我的问题和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 个复选框。我原以为“必需”可以完成这项工作,但显然不是。我需要编写一个自定义验证器来完成这项工作吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    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; }
    }
    

    【讨论】:

    • 这正是我一直在问自己的问题,即它如何理解选择至少 1 个区域的业务规则。我花时间使用自我验证模型来完成这项工作,并且我没有想到使用自定义验证属性。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多