«Обязательная» аннотация данных не работает для группы флажков

Моя проблема чем-то похожа на эту проблему Пользовательская проверка группы флажков

У меня есть группа флажков в представлении (New.cshtml), которые отображаются с использованием «ParentObject» в качестве модели представления.

Родительский объект.cs: -

public class ParentObject
{

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

}

Новый.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" />
}

Шаблон редактора для регионов находится в \Views\Shared\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; }
}

Почему аннотация «Обязательно» к данным «Регионы» не работает? Я хочу убедиться, что хотя бы 1 флажок установлен для регионов. Я бы подумал, что «Обязательно» выполнит эту работу, но, видимо, нет. Нужно ли мне писать собственный валидатор, чтобы это работало?

Спасибо.


person Reee    schedule 05.09.2011    source источник


Ответы (1)


Атрибут Required не может работать с коллекциями, как вам хотелось бы. Кроме того, как вы ожидаете, что он узнает, что хотя бы один флажок должен быть выбран из этого 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; }
}
person Darin Dimitrov    schedule 05.09.2011
comment
Это именно то, о чем я спрашивал себя, как понять бизнес-правило, согласно которому был выбран хотя бы 1 регион. Я потратил время, выполняя эту работу, используя модель самопроверки, и использование настраиваемого атрибута проверки не приходило мне в голову. Спасибо за вашу помощь. - person Reee; 05.09.2011