如何在 ASP.NET Core Razor Pages 中定义条件模型绑定?

How to define conditional model binding in ASP.NET Core Razor Pages?

我正在尝试在 ASP.NET Core Razor Pages 中制作一个简单的登录表单,它有一个电子邮件地址字段、一个密码字段、一个登录按钮和一个忘记密码按钮。

我想在文本字段上使用内置的客户端和服务器端验证,这样两个按钮提交都需要电子邮件字段,但只有登录按钮提交才需要密码字段。

[Required] 属性装饰模型属性使它们对于所有形式 post 处理程序都是强制性的,因为我正在寻找某种方式来以编程方式或通过模型属性或处理程序方法参数的属性。

是否可以定义条件模型绑定来实现这一点,或者是否有一个干净简单的替代方案?

您可以通过使用自定义必需属性来实现。例如,不同的按钮将触发不同的处理程序:

<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; }