Можно ли проверить свойство с помощью аннотации данных асинхронно с помощью ASP. NET Core? - PullRequest
1 голос
/ 08 мая 2020

У меня есть проект на основе asp. net core 3.1. Мне нужно добавить настраиваемое правило проверки, которое потребует вызова базы данных, чтобы определить действительность значения.

Например, при создании нового пользователя мне нужно проверить, нет ли другого имени пользователя в базу данных с тем же именем пользователя, прежде чем разрешить создание пользователя.

Если я могу создать настраиваемый атрибут UniqueUsername, тогда я смогу сделать что-то вроде этого

public class UniqueUsername : ValidationAttribute
{
    private readonly UserManager _manager = manager;

    public UniqueUsername (UserManager manager)
    {
       _manager = manager;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string username = value.ToString();

        if(_manager.Exists(username)) 
        {
             return new ValidationResult("The username provided belong to a different user.");
        }
        return ValidationResult.Success;
    }
}

Но _manager.Exists(username) - это синхронный вызов. Я хочу избежать блокировки основного потока, поэтому я хочу вместо этого вызвать await _manager.ExistsAsync(username), чтобы избежать блокировки основного потока.

Есть ли способ создать атрибут, который бы проверял одно свойство и записывал ошибки «если есть» в ModelState?

Если это невозможно с помощью аннотации данных, есть ли другой способ проверки свойства при записи ошибок в ModelState, чтобы, когда ModelState.IsValid() или TryValidateModel(model) называются, атрибут называется?

1 Ответ

0 голосов
/ 08 мая 2020

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

Вы можете использовать ModelState функции, которые вы упомянули, для выполнения асинхронных c вызовов вашей базы данных. Если вы хотите удалить logi c из вашего контроллера, вы можете создать служебные функции для этого.

Если вы открыты для сторонних библиотек, существует отличная и популярная библиотека проверки под названием Свободная проверка . Вот документация о том, как с его помощью можно выполнять асинхронные c вызовы: https://docs.fluentvalidation.net/en/latest/async.html

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