Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Убедитесь, что ваши классы наследуют 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 с атрибуция
Не связан с StackOverflow
scroll top