. NET основные атрибуты проверки на основе значений конфигурации - PullRequest
0 голосов
/ 05 апреля 2020

Я ищу способ ввести значения из конфигурации (опций) в параметры атрибутов проверки.

Сценарий, в котором меня это поразило, был пользовательский интерфейс идентификации лесов.

Это дает возможность настроить параметры длины пароля. Но изменения не учитываются на сгенерированной странице регистрации. Это потому, что на странице значения атрибутов проверки там жестко закодированы.

Кто-нибудь знает, возможно ли это вообще?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Если я не ошибаюсь, вы пытаетесь сделать какую-то вещь ниже, что невозможно:

public int passLength = 3;
public class Person
{
  [MaxLength(passLength)]
  public DateTime? DateOfBirth { get; set; }
}

Насколько я знаю, для этого нет обходного пути. Вы можете попробовать пользовательский валидатор и использовать сервис конфигурации как wi sh. Вы можете проверить этот пример кода

public class CustomPasswordAttribute : ValidationAttribute
{
  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
  {
    var configuration = (IConfiguration)validationContext
            .GetService(typeof(IConfiguration));

    if (!(value is String)) 
    {
      return new ValidationResult("Should be string");
    }

    int.TryParse(configuration["Validation:PasswordLength"], out int passLength);

    if (value.ToString().Length != passLength)
    {
      return new ValidationResult("Wrong Length");
    }

    return ValidationResult.Success;
  }
}

public class UserModel
{
  [CustomPassword]
  public string Password { get; set; }
}
1 голос
/ 05 апреля 2020

Можно подтвердить пароль, используя параметры, установленные при запуске.

Вот пример для бритвенных страниц, где пароль проверяется несколькими валидаторами, и любые ошибки добавляются в ModelState, где они появится в ValidationSummary.

foreach (var validator in _userManager.PasswordValidators)
{
    var passCheck = await validator.ValidateAsync(_userManager, null, Input.Password);
    if (!passCheck.Succeeded)
    {
        foreach (var error in passCheck.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
        return Page();
    }
}

Таким образом, простые проверки будут выполняться на стороне клиента, затем этот код будет запускаться на стороне сервера для применения параметров пароля.

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