0

在我看来,香港专业教育学院有3个复选框,我想验证他们的方式:MVC 3复选框验证

如果一个复选框被选中其他2被禁用,如果选中的复选框是选中,其他2个checkboes再次启用。

控制器

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

回答

4

如果值是互斥的,你可以考虑使用,而不是复选框单选按钮。他们似乎更适应你的情况。如果出于某种非常奇怪的原因,您仍然希望使用互斥的复选框,则可以使用javascript并订阅每个复选框的更改事件,并根据该值切换其他2个复选框。而对于服务器上验证这个模型,你可以写这既可以应用于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; } 
} 
+0

啊,那是真的我愚蠢......我当然应该使用单选按钮,对于愚蠢的问题抱歉。 – Timsen 2012-02-10 12:45:30