1

我的問題有點類似這個問題Custom Validation on group of checkboxes「必要」數據標註不工作的一組複選框的

我有一組複選框在視圖(New.cshtml),其使用呈現「ParentObject」作爲視圖模型

ParentObject.cs: -

public class ParentObject 
{ 

    [Required] 
    public IEnumerable<RegionObject> Regions { get; set; } 

} 

New.cshtml: -

@model ParentObject 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()){ 
@Html.LabelFor(model => model.Regions) 
@Html.EditorFor(model => model.Regions) 
@Html.ValidationMessageFor(model => model.Regions) 
<input type="submit" title="Create new parent object" class="button btn67" value="Create" /> 
} 

的地區編輯模板位於\查看\共享\ EditorTemplates \ RegionObject.cshtml 是這樣

@model RegionObject 
<p> 
@Html.CheckBoxFor(m => m.IsChecked) 
@Html.HiddenFor(m => m.Code) 
@Html.DisplayFor(m => m.Name) 
</p> 

的RegionObject視圖模型是:

public class RegionObject 
{ 
    public Guid Code { get; set; } 
    public string Name { get; set; } 
    public bool IsChecked { get; set; } 
} 

爲什麼是 '必要' 「Regions」上的數據註解不起作用?我想確保至少有一個複選框是針對區域選擇的。我會認爲'必需的'會做這項工作,但顯然不是。我是否需要編寫一個自定義驗證器來完成這項工作?

謝謝。

回答

1

必要屬性無法在集合上進行操作,因爲您可能希望。另外你如何期望它知道至少有一個複選框需要從這個RegionObject自定義類中選擇?您如何期望它與此集合中的IsChecked屬性相關?

我是否需要編寫自定義驗證器才能使其工作?

是的,您需要一個自定義驗證屬性來實現該屬性。例如:

public class AtLeastOneRegionMustBeCheckedAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var instance = value as IEnumerable<RegionObject>; 
     if (instance != null) 
     { 
      return instance.Where(x => x.IsChecked).Count() > 0; 
     } 
     return base.IsValid(value); 
    }  
} 

然後:

public class ParentObject 
{ 
    [AtLeastOneRegionMustBeChecked(ErrorMessage = "Please select at least one region")] 
    public IEnumerable<RegionObject> Regions { get; set; } 
} 
+0

這正是我一直在問我自己來怎麼會明白選擇,包括至少一個區域的業務規則。我花時間使用自我驗證模型進行這項工作,並且使用自定義驗證屬性對我來說不會發生。謝謝你的幫助。 – Reee