Проверка ViewModel с вложенными моделями - PullRequest
1 голос
/ 04 февраля 2011

Моя модель содержит два объекта (Напоминания и Пользователи). Каждое напоминание связано с одним пользователем.

public class Reminder
    {
    [DisplayName("Subject")]
    [Required(ErrorMessage = "{0}: error message.")]
    [StringLength(200, ErrorMessage = "{0}: error message.")]
    public string Name { get; set; }

    [DisplayName("Supervisor")]
    public User DepartmentSupervisor { get; set; }
    }

public class User 
    {
    [DisplayName("Username")]
    [Required(ErrorMessage = "{0}: error message.")]
    [StringLength(25, ErrorMessage = "{0}: lerror message.")]
    public string Username { get; set; }

    [DisplayName("Email")]
    [StringLength(50, ErrorMessage = "{0}: error message.")]
    [Email(ErrorMessage="Not valid.")]
    public string Email { get; set; }
    }

Я определил модель представления, которую я использую для передачи данных в мое представление:

public class RemindersViewModel
    {
        public RemindersViewModel()
        {
            this.Supervisors = new List<SelectListItem>();
        }
        public Models.Reminder Reminder { get; set; }
        public List<SelectListItem> Supervisors { get; set; }
    }

Супервизоры - это список пользователей (SelectListItem), который я использую для отображения комбо.
Когда я отправляю форму, контроллер повторно связывает объект с напоминанием:

public ActionResult Edit(Guid id, Models.Reminder Reminder)
{
    if (!ModelState.IsValid)
    {
    // PROBLEM.
    }
}

Все работает нормально, и у меня есть напоминание, связанное с выбранным пользователем (имя пользователя), но, поскольку мне не нужно показывать адрес электронной почты в раскрывающемся списке, привязка не может заполнить поле, поскольку она не существует в моей форме. В процессе проверки я получаю сообщение об ошибке, потому что он пытается проверить модель User, а это не то, чего я действительно хочу. Каков наилучший подход к вложенным моделям?

1 Ответ

1 голос
/ 04 февраля 2011

Рассматривали ли вы использование моделей просмотра?Они включают в себя только те свойства, которые требуются вашему представлению, и проверку для этого конкретного представления.Поэтому, если вашему представлению не требуется электронное письмо, вы пишете модель представления без электронного письма, и проверка проходит отлично.Затем внутри действия вашего контроллера вы отображаете эту модель представления в соответствующую модель домена. AutoMapper - отличный инструмент для этой работы.

...