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>
}
如果值是互斥的,您可以考虑使用单选按钮而不是复选框。他们似乎更适合你的场景。如果出于某种非常奇怪的原因,你仍然想使用互斥的复选框,你可以使用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; }
}