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