ASP.NET MVC, куда поместить пользовательские атрибуты проверки

#validation #asp.net-mvc-3

#проверка #asp.net-mvc-3

Вопрос:

Я возился с некоторыми ASP.NET Структуры решения MVC3 и я остановились на дизайне, который состоит из следующих проектов:

 MyApp.Web -  MVC3 Web Layer
MyApp.Data - Repositories and infrastructure for managing data
MyApp.Domain - POCO Entities
MyApp.Service - Service layer through with I manipulate the model
MyApp.Test - doh
  

Куда бы вы поместили свои пользовательские классы атрибутов проверки? Насколько я понимаю, они должны быть включены в проект домена, потому что они специфичны для классов сущностей, которые там находятся, но тогда мне нужно было бы ссылаться на ряд DLL-файлов, таких как System.Web.MVC, и я хотел бы свести ссылки в этом проекте к минимуму. Мысли?

Обновить:

Я удалил все атрибуты из своего доменного проекта и создал модели просмотра, чтобы включить их в веб-проект. Поместил все мои пользовательские классы проверки в папку в веб-проекте. Спасибо, ребята

Ответ №1:

Я бы создал эти атрибуты в веб-проекте и добавил их к viewmodel вместо объекта.

Ответ №2:

Вам не нужно ссылаться на веб-библиотеки DLL. Только System.ComponentModel.DataAnnotations

Поместите атрибуты проверки туда, где они используются.d

Обновить

Почему бы и нет? Почти каждый пример, который я видел, использует POCOs в представлениях. Какая альтернатива? Создаем какие-то классы-оболочки для моих POCOs?

Из-за:

Безопасность

Допустим, вы получили пользовательский POCO с IsAdmin полем. Используя POCO, ModelBinder в MVC установит это свойство, если оно опубликовано «хакером», который, следовательно, получает доступ администратора.

Изоляция

Использование POCO в вашем представлении делает ваше представление косвенно зависимым от вашей базы данных. Конечно, предполагается, что POCOs удалит эту зависимость. Но на самом деле они редко это делают.

Настройка

Вы редко показываете все значения в представлении, поскольку они хранятся в базе данных.

Код для адаптации модели должен находиться не в представлении, а в viewmodel. Используйте как можно меньше логики в своих представлениях.

Комментарии:

1. вам это нужно для проверки на стороне клиента, т. Е. для реализации IClientValidatable

2. Ваши POCOs не должны использоваться в ваших представлениях.

3. Почему бы и нет? Почти каждый пример, который я видел, использует POCOs в представлениях. Какая альтернатива? Создаем какие-то классы-оболочки для моих POCOs?

4. @woggles, тогда это плохие примеры, которые ты видел 🙂

5. Из-за безопасности, изоляции и настройки. a) Предположим, что вы получили User POCO с IsAdmin полем. Используя POCO, ModelBinder в MVC установит это свойство, если оно опубликовано «хакером». б) Использование POCO в вашем представлении делает ваше представление косвенно зависимым от вашей базы данных. c) Ваша ViewModel должна содержать логику для ее адаптации, а не ваш view (удалите весь код из views и добавьте его вместо viewmodels).

Ответ №3:

У меня были бы атрибуты DataAnnotation в вашем веб-проекте, предпочтительно в общем.Папка атрибутов. Я думаю, что jgauffin имел в виду (и я бы согласился), что ваши пользовательские атрибуты действительно должны украшать ViewModels vs Entities в вашем доменном проекте.

Ответ №4:

Я бы последовал вашему первоначальному намерению добавить атрибуты к объектам домена