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