【问题标题】:How to define conditional model binding in ASP.NET Core Razor Pages?如何在 ASP.NET Core Razor Pages 中定义条件模型绑定?
【发布时间】:2020-02-19 06:10:27
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以通过使用自定义 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; }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 2019-06-03
      • 1970-01-01
      • 2019-12-15
      • 2023-02-04
      • 1970-01-01
      • 2018-12-11
      • 2018-07-16
      相关资源
      最近更新 更多