У меня есть проект на основе 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)
называются, атрибут называется?