我正在尝试在ASP.NET Core Razor Pages中创建一个简单的登录表单,该表单具有电子邮件地址字段,密码字段,登录按钮和忘记密码按钮。
我想在文本字段上使用内置的客户端和服务器端验证,以便两个按钮提交都需要电子邮件字段,而登录按钮提交则只需要密码字段。
使用[Required]
属性装饰模型属性使它们对于所有表单后处理程序都是必需的,而在我正在寻找某种方式来进行条件模型绑定时,可以通过编程方式或通过模型属性的属性来实现,处理程序方法参数。
是否可以定义条件模型绑定来实现此目的,还是有一个干净简单的替代方法?
答案 0 :(得分:2)
您可以通过使用custom required属性来实现。例如,不同的按钮将触发不同的处理程序:
<div>
<button type="submit" asp-page-handler="Login">Login</button>
<button type="submit" asp-page-handler="ChangePassword">login</button>
</div>
注册IActionContextAccessor
:
services.AddHttpContextAccessor();
需要定制的属性:
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;
}
}
}
应用于您的媒体资源:
[BindProperty]
[Required]
[MinLength(6)]
public string UserName { get; set; }
[BindProperty]
[MyRequiredAttribute("Login"), MinLength(6)]
public string Password { get; set; }