如何为最小和最大数量的复选框创建ASP.NET MVC3验证器?

Aus*_*tin 4 asp.net-mvc unobtrusive-javascript jquery-validate asp.net-mvc-3

我想要一个可重复使用的验证器,我可以在一组复选框字段上使用它,这将允许我指定要选择的最小数字和可以选择的最大数字.我不确定如何创建服务器端检查和客户端验证,以使用不引人注目的javascript挂钩到jQuery验证框架.

这个问题似乎是客户端适配器的良好开端,但是如何将它们组合在一起以在服务器上验证它?

Dar*_*rov 5

以下是您至少可以开始进行服务器端验证的方法.这是一篇非常好的文章,说明了多个概念.

验证属性:

public class CheckBoxesValidationAttribute : ValidationAttribute
{
    public CheckBoxesValidationAttribute (int min, int max)
    {
        Min = min;
        Max = max;
    }

    public int Min { get; private set; }
    public int Max { get; private set; }

    public override bool IsValid(object value)
    {
        var values = value as IEnumerable<bool>;
        if (values != null)
        {
            var nbChecked = values.Where(x => x == true).Count();
            return Min <= nbChecked && nbChecked <= Max;
        }
        return base.IsValid(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

模型:

public class MyViewModel
{
    [CheckBoxesValidation(1, 2, ErrorMessage = "Please select at least one and at most 2 checkboxes")]
    public IEnumerable<bool> Values { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Values = new[] { true, false, true, false }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

查看(〜/ Views/Home/Index.cshtml):

@Html.ValidationSummary()
@using (Html.BeginForm()) 
{
    @Html.EditorFor(x => x.Values)
    <input type="submit" value="OK" />
}
Run Code Online (Sandbox Code Playgroud)

编辑模板(~/Views/Home/EditorTemplates/bool.cshtml):

@model bool
@Html.CheckBoxFor(x => x)
Run Code Online (Sandbox Code Playgroud)