MVC 3复选框验证

本文关键字:验证 复选框 MVC | 更新日期: 2023-09-27 18:23:56

在我的VIew中,我有3个复选框,我想用这种方式验证它们:

如果选中一个复选框,则禁用其他2个复选框;如果取消选中复选框,将再次启用其他2个选中框。

控制器

  public ActionResult SolarPart()
    {
        var model = new SolarParentViewModel();
        var list = new List<URLTimeLimitViewModel>();
        list.Add(new URLTimeLimitViewModel { Name = "14 dage", IsChecked = false, Id = 1 });
        list.Add(new URLTimeLimitViewModel { Name = "1 Måned", IsChecked = false, Id = 2 });
        list.Add(new URLTimeLimitViewModel { Name = "2 Måneder", IsChecked = false, Id = 3 });
        model.TimeLimit = list;
        return View(model);
    }

查看

@for (var i = 0; i < Model.TimeLimit.Count; i++)
{
  <div class="editor-label">
    @Html.LabelFor(c=>Model.TimeLimit[i].Name, Model.TimeLimit[i].Name)
      @Html.HiddenFor(c=>Model.TimeLimit[i].Id) 
      @Html.CheckBoxFor(c=>Model.TimeLimit[i].IsChecked)
  </div>
}

MVC 3复选框验证

如果值是互斥的,您可以考虑使用单选按钮而不是复选框。他们似乎更适合你的场景。如果出于某种非常奇怪的原因,你仍然想使用互斥的复选框,你可以使用javascript并订阅每个复选框的更改事件,并根据值切换其他两个复选框。为了在服务器上验证该模型,您可以编写一个自定义验证属性,该属性可以应用于视图模型上的TimeLimit属性:

public class MaximumOneTimeLimitCanBeCheckedAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IEnumerable<URLTimeLimitViewModel>;
        if (list == null)
        {
            return true;
        }
        return list.Where(x => x.IsChecked).Count() < 2;
    }
}

然后:

public class SolarParentViewModel
{
    [MaximumOneTimeLimitCanBeChecked]
    public IList<URLTimeLimitViewModel> TimeLimit { get; set; }
}