Как определить условную привязку модели в ASP.NET Core Razor Pages? - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь создать простую форму входа в ASP.NET Core Razor Pages, которая имеет поле адреса электронной почты, поле пароля, кнопку входа и кнопку забытого пароля.

Я хочуиспользовать встроенную проверку на стороне клиента и на стороне сервера для текстовых полей, так что поле электронной почты требуется для обеих кнопок, но поле пароля требуется только для отправки кнопки входа в систему.

Декорирование моделисвойства с атрибутом [Required] делают их обязательными для всех обработчиков записей формы, где, поскольку я ищу какой-то способ условного связывания модели, либо программно, либо через атрибут свойств модели или параметров метода обработчика.

Можно ли определить условное связывание модели для достижения этого или есть чистая и простая альтернатива?

1 Ответ

2 голосов
/ 23 октября 2019

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

<div>
    <button type="submit" asp-page-handler="Login">Login</button>

    <button type="submit" asp-page-handler="ChangePassword">login</button>
</div>
  1. Регистрация IActionContextAccessor:

    services.AddHttpContextAccessor();
    
  2. Требуется пользовательский атрибут:

    public class MyRequiredAttribute : RequiredAttribute 
    {
        private string _handlerName;
        public MyRequiredAttribute(string handlerName)
        {
            _handlerName = handlerName;
        }
    
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
    
            var httpContext = validationContext.GetRequiredService<IHttpContextAccessor>().HttpContext;
    
            var handlerName = httpContext.Request.Query["handler"].ToString();
            if (handlerName.ToLower().Equals(_handlerName.ToLower()))
            {
                return base.IsValid(value, validationContext);
    
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }
    
  3. Применить к вашей собственности:

    [BindProperty]
    [Required]
    [MinLength(6)]
    public string UserName { get; set; }
    
    [BindProperty]
    [MyRequiredAttribute("Login"), MinLength(6)]
    public string Password { get; set; }
    
...