Пользовательская проверка с аннотациями данных - PullRequest
8 голосов
/ 15 декабря 2009

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

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

Как я могу реализовать такую ​​вещь вместе с аннотациями данных?

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

/ M

1 Ответ

12 голосов
/ 15 декабря 2009

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

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

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

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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...