Проверка на ViewModels в ASP.NET MVC - PullRequest
19 голосов
/ 16 июля 2009

Большинство советов о том, как реализовать проверку в ASP.NET MVC, по-видимому, сосредоточены вокруг Модели (либо создание уровней обслуживания между моделью и контроллером, либо украшение свойств модели с атрибутами проверки).

В моем приложении я использую ViewModels для всей связи между контроллерами и представлениями.

У меня есть ViewModel для моей страницы входа в систему под названием «LoginViewModel» со ​​свойством «EmailAddress».

Когда пользователь вводит свой адрес электронной почты и нажимает кнопку отправки, эта ViewModel заполняется и отправляется контроллеру, где проверяется адрес электронной почты.

Это должен быть действительный адрес электронной почты, а пользователь должен быть из домена, зарегистрированного в системе.

Какой удобный способ добавить проверку к этому? Должен ли я поставить проверку в самом ViewModel? Или он должен оставаться в контроллере?

Ответы [ 2 ]

5 голосов
/ 17 июля 2009

«Должен ли я поставить проверку в самом ViewModel? Или она должна остаться в контроллере?» Я согласен с Робертом, но я бы добавил заглушку для дополнительной автоматизации.

Если вы посмотрите на такой инструмент, как xVal , вы увидите, что обычная проверка (например, обязательные поля, числа в пределах диапазонов, строки, соответствующие регулярным выражениям) может быть автоматически выполнена путем украшения полей ваших данных классы. Фактически, xVal может автоматически писать JavaScript для рутинных проверок, чтобы он выполнялся на стороне клиента. Все без написания кода. Более глубокие проверки (например, является ли этот пользователь членом домена, зарегистрированного в нашей базе данных?) Происходят на стороне сервера внутри самого уровня модели.

Использование идиомы ViewModel может создать некоторые проблемы для этой схемы. Мой текущий подход заключается в том, чтобы внедрить мои объекты сущностей в мою модель представления, например

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

public class ContactView {
    public Contact Contact { get; set; }
    public string SomeOtherViewProperty { get; set; }
}

и затем в контроллере при обновлении модели происходит мелкая проверка:

UpdateModel(contactViewModel.Contact, "Contact");

и проверки, требующие дополнительной информации или более сложных вычислений, происходят внутри самого слоя модели.

Другой подход состоит не в том, чтобы встраивать объект-сущность, а просто отображать отдельные поля между ними. Недавно мне стало известно об инструменте AutoMapper , который автоматически связывает поля между доменом и объектами модели представления. Похоже, он должен поддерживать этот метод проверки, хотя я еще не использовал его.

3 голосов
/ 16 июля 2009

В учебных руководствах NerdDinner показано, что проверка выполняется в ваших частичных классах модели (т. Е. Linq to SQL или Entity Framework). Но поскольку вы используете View Models, вы можете поместить туда логику проверки.

Логика проверки не входит в контроллер. Скорее, он подключается к контроллеру с помощью свойства проверки, то есть ModelState.IsValid

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Dinner dinner) {

    if (ModelState.IsValid) {

        try {
            dinner.HostedBy = "SomeUser";

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new { id=dinner.DinnerID });
        }
        catch {
            ModelState.AddModelErrors(dinner.GetRuleViolations());
        }
    }

    return View(new DinnerFormViewModel(dinner));
}

Полная информация здесь:

Построение модели
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

и здесь:

ViewData и ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

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