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

Требуется ли еще проверка ASP.Net MVC 2 в отношении шаблонов и использования?

Вот земля земли. Как и у большинства людей, у меня есть объект моего домена, и у меня есть мои модели просмотра. Мне нравится идея использования моделей просмотра, так как она позволяет создавать модели специально для данного контекста представления без необходимости изменять мои бизнес-объекты.

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

С MVC 2 вы можете заставить его автоматически выполнять проверку на стороне клиента/сервера на основе правил проверки текущего объекта. Но поскольку правила проверки определены для объекта домена, а не для модели представления, мне пришлось бы дублировать правила проверки на модели представления, чтобы заставить это работать.

Как другие справляются с этим типом проблемы? Я считаю, что помимо сопоставления данных из объекта домена с моделью просмотра нам также необходимо сопоставить правила проверки, но я не видел, чтобы другие говорили об этой проблеме... Недавно Брэд Уилсон рассказал об этой проблеме на самом деле, но на самом деле не рассматривал дублирование правил для объекта домена и моделей взглядов... что вы думаете?

Приветствия Энтони

4b9b3361

Ответ 1

Атрибуты DataAnnotation предназначены для проверки ввода и предоставления обратной связи пользовательскому интерфейсу конечным пользователям. Это действительно их единственное предназначение. Я использую разные стратегии проверки для объектов пользовательского интерфейса и бизнес-объектов, поэтому атрибуты проверки DA только заканчиваются на моделях, показываемых пользователю.

Ответ 2

Это может быть неприемлемо, но что, если вы просто перенесли свои правила проверки/аннотации из своих моделей в свои ViewModels? В нескольких проектах, которые я планировал, мы решили не допустить, чтобы View получал доступ к чему-либо, кроме информации, отображаемой через соответствующий ViewModel. Поскольку все взаимодействия данных выполнялись через ViewModel, не было бы необходимости иметь валидацию для объектов модели.

Счетчик этого аргумента состоит в том, что вы можете легко дублировать некоторые правила проверки, так как различные ViewModels могут взаимодействовать с одними и теми же Моделями. В этом случае имеет смысл просто объявить вашу модель как свойство, выставленное на вашем ViewModel. Для обратной передачи они могли принять модель в качестве своего параметра, позволяя инфраструктуре ModelBinder обрабатывать запрос. В этом случае, если ModelState.IsValid является ложным, вы можете просто переназначить свойство в ViewModel перед повторным отображением представления.

Я бы рекомендовал переместить ваши аннотации в свои ViewModels. Это имеет смысл, так как многие Представления являются: а) результатом составления нескольких моделей или б) подмножеством данных модели.

Ответ 3

Оказывается, AutoMapper может сделать это для нас автоматически, что является наилучшим вариантом.

Пользователи AutoMapper: перенести атрибуты проверки на viewmodel?
http://groups.google.com/group/automapper-users/browse_thread/thread/efa1d551e498311c/db4e7f6c93a77302?lnk=gst&q=validation#db4e7f6c93a77302

Мне не удалось опробовать предлагаемые решения там, но намереваются в ближайшее время.

(Перекрестил это также на мой вопрос (dupe)).

Ответ 4

Вероятно, мы не должны использовать модели просмотра вообще? Определите правила проверки для объектов уровня модели.

Ответ 5

Я уже давно это рассматриваю. Я полностью понимаю ответ Брэда. Однако предположим, что я хочу использовать другую структуру проверки, которая подходит для аннотирования объектов домена и моделей просмотра.

Единственное решение, которое я могу найти на бумаге, которая все еще работает с атрибутами, - это создать еще один атрибут, который "указывает" на свойство сущности домена, которое вы зеркалируете в своей модели представления. Вот пример:

// 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, можно было бы расширить, чтобы обработать этот новый атрибут и запустить атрибуты проверки в свойстве класса зависимостей, но с вашим значением свойства модели представления. У меня просто не было времени, чтобы плоть это больше.

Любые мысли?