Подтвердить что ты не робот

Проверка на ViewModels в ASP.NET MVC

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

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

У меня есть ViewModel для моей страницы входа с именем "LoginViewModel" с свойством "EmailAddress".

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

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

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

4b9b3361

Ответ 1

"Должен ли я помещать валидацию в сам 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, который автоматически связывает поля между объектами модели домена и представления. Похоже, что он должен поддерживать этот метод проверки, хотя я еще не использовал его.

Ответ 2

Учебники 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