Пользовательская проверка с аннотациями данных

asp.net-mvc data-annotations entity-framework

Вопрос

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

Мне нужно выполнить запросы к базе данных, чтобы увидеть, существует ли материал там или нет, а затем сообщить пользователю, если появляется «ошибка пользовательской проверки базы данных», например, «Название компании уже существует»

Как я могу реализовать такую вещь вместе с dataannotations?

У меня есть все запросы и т.д., используя linq и Entity Framework, который поставляется с 3.5sp1

/ M

Принятый ответ

Пользовательские атрибуты, расширяющие аннотации данных

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

Убедитесь, что ваши классы наследуют класс System.ComponentModel.DataAnnotations.ValidationAttribute :

public class MustNotExist: ValidationAttribute
{
    ...
}

предосторожность

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

Мое решение состояло в том, чтобы иметь отдельный интерфейс, класс и атрибут.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

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

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

Таким образом, я смог запустить внешнюю проверку только для тех действий, которые действительно в ней нуждались, и эта техника также помогла моему коду действий контроллера оставаться чистым и коротким. Все, что мне нужно было сделать, это проверить, есть ли какие-либо ошибки состояния модели.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему