Можно ли проверить модель MVC-3 без проверки «подмоделей»? - PullRequest
3 голосов
/ 15 июля 2011

У меня есть класс, который требует указания другого класса, но я не хочу, чтобы валидатор MVC ModelState проверял, допустима ли вторичная модель. Возможно ли это?

Вот краткий обзор:

Мои сущности выглядят примерно так:

public class WidgetType
{
    public long Id { get; private set; }

    [Required]
    public string Name { get; set; }

    ...
}

public class Widget
{
    public long Id { get; private set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public WidgetType WidgetType { get; set; }

    ...
}

Я инкапсулировал их в класс WidgetViewModel, который я передаю в / из вида следующим образом:

public class WidgetViewModel
{
    public Widget Widget { get; set; }

    public ICollection<WidgetType> WidgetTypes
    {
        get
        {
            return _repository.GetWidgets();
        }
    }

    ...
}

Мой взгляд выглядит примерно так:

...
@Html.DropDownListFor( m => m.Widget.WidgetType.Id, new SelectList( new EquipmentViewModel().EquipmentTypes, "Id", "Name" ) )
...

Все это работает, кроме проверки. ModelState.IsValid всегда ложно, потому что требуется "Widget.WidgetType.Name". Мне нужно, чтобы пользователь выбрал WidgetType, но я не хочу, чтобы ModelState проверялся глубже, чем "Widget.WidgetType.Id" (что должно быть всем, что Widget необходимо для его внешнего ключа?).

Есть ли лучший способ сделать это? Я чувствую, что должен быть какой-то способ проверки без рекурсивного осмотра свойств, но я не могу его найти. Чего мне не хватает ...?

Ответы [ 3 ]

4 голосов
/ 15 июля 2011
public class WidgetViewModel
{    
    [Required]
    public string Name { get; set; }

    [Required]
    public WidgetType WidgetTypeId { get; set; }

    public SelectList WidgetTypes 
    {
        get
        {
             //This should be popuplated in your controller or factory not in the view model
             retun new SelectList{ _repository.GetWidgets(),"Id","Name");

        }
   }
}

По вашему мнению

 @Html.DropDownListFor( m => m.WidgetTypeId, Model.WidgetTypes)

А в вашем контроллере

public ActionResult Create(WidgetViewModel model)
{
    Widget widget = new Widget{
         Name = model.Name,
         WidgetType = yourManager.GetWidgetTypeByID(model.WigetTypeId);
    };

    yourManager.Create(widget);

    //...
}
3 голосов
/ 15 июля 2011

Если вам нужно только WidgetID, вам не нужно включать весь Widget в WidgetViewModel. Просто есть свойство под названием WidgetID. Классы моделей представлений должны иметь только те данные, которые необходимы для представления.

В методе действия контроллера, который вызывается при отправке формы, вы можете использовать WidgetID для извлечения объекта Widget из базы данных, если это необходимо.

1 голос
/ 01 августа 2011

http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/ дает пример частичной проверки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...