«Обязательные» аннотации данных не работают для группы флажков - PullRequest
1 голос
/ 05 сентября 2011

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

У меня есть группа флажков в представлении (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" />
}

Шаблон редактора для регионов находится в \ 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 флажок установлен в отношении регионов. Я бы подумал, что «Обязательно» сделает эту работу, но, очевидно, нет. Мне нужно написать собственный валидатор, чтобы сделать эту работу?

Спасибо.

1 Ответ

1 голос
/ 05 сентября 2011

Атрибут Обязательный не может работать с коллекциями, как вы пожелаете.Кроме того, как вы ожидаете, что он узнает, что по крайней мере один флажок должен быть выбран из этого 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; }
}
...