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

时间:2019-10-23 04:07:16

标签: asp.net-core razor razor-pages

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

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

使用[Required]属性装饰模型属性使它们对于所有表单后处理程序都是必需的,而在我正在寻找某种方式来进行条件模型绑定时,可以通过编程方式或通过模型属性的属性来实现,处理程序方法参数。

是否可以定义条件模型绑定来实现此目的,还是有一个干净简单的替代方法?

1 个答案:

答案 0 :(得分:2)

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

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