Как выполнить пользовательскую проверку с помощью DataAnnotation и получить значение из config appsettings.json? - PullRequest
0 голосов
/ 15 октября 2018

Я делаю пользовательскую проверку поля ввода в ASP.NET Core MVC (2.1).Я хотел бы добавить простое поле Captcha с просьбой ввести несколько цифр, которые можно легко перенастроить в файле appsettings.json.Я знаю, что существует множество библиотек, выполняющих капчу, но это не то, что я хочу для этого конкретного случая.

У меня проблемы с получением значения из appsettings.json.Приведенный ниже код прекрасно компилируется, но я не знаю, как получить значение из файла appsettings.json в классе CaptchaCustomAttribute.

Вот мой код:

// appsettings.json
{ 
  "GeneralConfiguration": {
    "Captcha":  "123456"
    }
}

// GeneralConfiguration.cs
public class GeneralConfiguration
{
    public string Captcha { get; set; }
}

// startup.cs / dependency injection
public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<GeneralConfiguration>(Configuration.GetSection("GeneralConfiguration"));
 }

// form model
public class ContactFormModel {
  ... simplified 

  [Display(Name = "Captcha")]
  [Required(ErrorMessage = "Required")]
  [CaptchaCustom]
  public string Captcha { get; set; }

}

// CaptchaCustomAttribute.cs
public sealed class CaptchaCustomAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null) return new ValidationResult("value cannot be null");
        if (value.GetType() != typeof(string)) throw new InvalidOperationException("can only be used on string properties.");

        // get value of Captcha here. How?  

        // this will fail for obvious reasons
        //var service = (GeneralConfiguration)validationContext
        //            .GetService(typeof(GeneralConfiguration));

        //if ((string)value == service.Captcha)
        //{
        //    return ValidationResult.Success;
        //}
        return new ValidationResult("unspecified error");
    }
}

1 Ответ

0 голосов
/ 15 октября 2018

Код, который вы прокомментировали в своем вопросе, очень близок к работе, за исключением одной маленькой детали.Когда вы используете IServiceCollection.Configure<T>, вы добавляете (среди прочего) регистрацию для IOptions<T> в контейнер DI, а не регистрацию для самой T.Это означает, что вам нужно запросить IOptions<GeneralConfiguration> в вашей реализации ValidationAttribute, например:

var serviceOptions = (IOptions<GeneralConfiguration>)
    validationContext.GetService(typeof(IOptions<GeneralConfiguration>));
var service = serviceOptions.Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...