Пользовательская проверка с аннотациями данных
-
19-09-2019 - |
Вопрос
Я использую аннотации данных для проверки вводимых данных, но я застрял, когда дело доходит до более пользовательского способа проверки данных.
Мне нужно запускать запросы к базе данных, чтобы узнать, существует ли там материал или нет, а затем сообщать пользователю, если появляется "ошибка пользовательской проверки базы данных", например "Название компании уже существует"
Как я могу реализовать такую вещь вместе с 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
}
Таким образом, я смог запустить внешнюю проверку только для тех действий, которые действительно нуждались в ней, и этот метод также помог моему коду действий контроллера оставаться чистым и коротким.Все, что мне нужно было сделать, это проверить, есть ли какие-либо ошибки состояния модели.