Решение .NET MVC с проектом DAL: куда поместить пользовательские атрибуты проверки (на стороне сервера и на стороне клиента)

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

Приложение .NET MVC, сначала использующее идентификатор и код EF. В нем у меня есть CustomValidations.cs, где я написал некоторые пользовательские атрибуты проверки: некоторые из них содержат как серверную, так и клиентскую проверку. Обе модели и viewmodels используют эти атрибуты проверки. (проверка на стороне клиента выполняется путем реализации IClientValidatable и добавления его метода GetClientValidationRules).

Например (это находится в папке CustomAttributes / CustomValidations.cs в проекте MVC):

 namespace MyApp.CustomAttributes {

    public class RequiredIfSomething : ValidationAttribute, IClientValidatable {
        public RequiredIfSomething() { }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
            //server-side validation code here
            return ValidationResult.Success;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
            // client-side validation code here. 
            yield return rule;
        }
    }
}
 

Сейчас я пытаюсь разделить решение в разных проектах. Я начал с создания проекта библиотеки классов (MyApp.DAL) для уровня DAL и переместил все мои объекты entity Framework, dbcontext (ApplicationDbContext, который является IdentityDbContext) и папку миграции из проекта MVC в новый проект, добавил ссылки в проект MVC и изменил пространства имен и т.д.
Итак, теперь проект MVC использует проект DAL.

Кажется, все это работает, но теперь у меня проблема с моими пользовательскими валидаторами: я предполагаю, что эти проверки (или, по крайней мере, некоторые из них) должны находиться в проекте DAL, поскольку я украшаю ими свойства моделей. Но тогда у меня была бы в проекте DAL не только проверка на стороне сервера, но и проверка на стороне клиента, которая, по моему мнению, должна быть специфичной для mvc (и, следовательно, не должна находиться в проекте DAL)…

Каков был бы правильный способ сделать это?

Ответ №1:

Как правило, это решается с помощью viewmodels на веб-уровне и ваших базовых моделей EF на уровне доступа к данным. Ваши пользовательские средства проверки для проверки ввода данных клиентом и т. Д. Будут Использоваться в ваших моделях просмотра и находиться на веб-уровне. Ваши пользовательские средства проверки для ваших моделей (обычно для защиты целостности данных, вставляемых в БД) будут использоваться в ваших моделях EF и находиться на уровне доступа к данным. Существует несколько библиотек сопоставления, которые помогают переводить между необработанными моделями EF и viewmodels (auto mapper, вероятно, является наиболее распространенным), если вы не привыкли это делать.