Нужно ли больше проверять ASP.Net MVC 2 с точки зрения шаблонов и использования?
Здесь лежит земля. Как и у большинства людей, у меня есть мой доменный объект, и у меня есть модели представлений. Мне нравится идея использования моделей представлений, поскольку она позволяет создавать модели специально для данного контекста представления без необходимости изменять мои бизнес-объекты.
У меня проблема с проверкой уровня типа, определенной в моем доменном объекте, и передачей этих правил клиенту. В этом случае предположим, что я использую аннотации данных для описания правил проверки, когда я перемещаю данные из объекта домена в модель представления, модель представления больше не знает, какую проверку она должна выполнить для интерфейса (поскольку проверка выполняется определены обратно на предметный объект).
С MVC 2 вы можете заставить его автоматически выполнять проверку клиент / сервер на основе правил проверки текущего объекта. Но поскольку правила валидации определены для объекта домена, а не для модели представления, мне пришлось бы продублировать правила валидации в модели представления, чтобы заставить это работать.
Как другие решают эту проблему? Я думаю, что помимо отображения данных из объекта предметной области в модель представления нам также необходимо сопоставить правила валидации, но я действительно не видел, чтобы другие говорили об этой проблеме... Брэд Уилсон недавно говорил об этой проблеме подробно, но на самом деле не рассматривал дублирование правил на объекте предметной области и на моделях представления... что вы думаете?
Ура Энтони
5 ответов
Атрибуты DataAnnotation предназначены для проверки ввода и предоставления обратной связи пользовательского интерфейса конечному пользователю. Это действительно их единственное предназначение. Я использую разные стратегии валидации для объектов пользовательского интерфейса и бизнес-объектов, поэтому атрибуты валидации DA в конечном итоге отображаются только на моделях, показанных пользователю.
Оказывается, что AutoMapper может сделать это для нас автоматически, что является лучшим сценарием.
Пользователи AutoMapper: перенести атрибуты проверки в модель представления?
http://groups.google.com/group/automapper-users/browse_thread/thread/efa1d551e498311c/db4e7f6c93a77302?lnk=gst&q=validation
Я не удосужился опробовать предлагаемые решения там, но собираюсь в ближайшее время.
(Кросс опубликовал это на моем (двойном) вопросе).
Это может не подходить, но что, если вы просто переместили свои правила / аннотации проверки из ваших Моделей в ваши ViewModels? В нескольких проектах, в которых я участвовал, мы решили запретить представлению получать доступ к чему-либо, кроме информации, предоставляемой через соответствующую ему модель представления. Поскольку все взаимодействие с данными будет осуществляться через ViewModel, не будет необходимости в проверке ваших объектов Model.
В противовес этому аргументу можно легко дублировать определенные правила проверки, поскольку разные ViewModel могут взаимодействовать с одними и теми же моделями. В этом случае, возможно, имеет смысл просто объявить вашу Модель как свойство, отображаемое в вашей ViewModel. Для обратных передач они могут принять Model в качестве своего параметра, позволяя инфраструктуре ModelBinder обрабатывать запрос. В этом случае, если ModelState. IsValid имеет значение false, вы можете просто переназначить свойство в свою модель представления перед повторным отображением представления.
Я бы порекомендовал перенести ваши аннотации в ваши ViewModels. Это имеет смысл, поскольку многие виды являются a) результатом компоновки нескольких моделей или b) подмножеством данных модели.
Я уже давно обдумывал это. Я полностью понимаю ответ Брэда. Однако давайте предположим, что я хочу использовать другую платформу проверки, которая подходит для аннотирования как доменных сущностей, так и моделей представления.
Единственное решение, которое я могу придумать на бумаге, который все еще работает с атрибутами, - это создать еще один атрибут, который "указывает" на свойство объекта домена, которое вы отражаете в своей модели представления. Вот пример:
// In UI as a view model.
public class UserRegistration {
[ValidationDependency<Person>(x => x.FirstName)]
public string FirstName { get; set; }
[ValidationDependency<Person>(x => x.LastName)]
public string LastName { get; set; }
[ValidationDependency<Membership>(x => x.Username)]
public string Username { get; set; }
[ValidationDependency<Membership>(x => x.Password)]
public string Password { get; set; }
}
Платформа, подобная xVal, может быть расширена для обработки этого нового атрибута и запуска атрибутов проверки для свойства класса зависимостей, но со значением свойства вашей модели представления. У меня просто не было времени конкретизировать это.
Какие-нибудь мысли?
Возможно, нам вообще не следует использовать модели представления? И определить правила проверки для сущностей слоя модели.