我有一个注册操作,尝试检查模型状态是否有效,尝试登录,如果失败则重新验证模型。我无法使用TryValidateModel
重新验证模型。我修改了一些函数来强制模型无效。
以下是我的注册动作:
[HttpPost]
public IActionResult SignUp(SignUpModel signUp, string returnURL)
{
if (ModelState.IsValid)
{
if (loginManager.SignUp(signUp)) return Ok("Account created");
TryValidateModel(signUp); // breakpoint 1
}
return View(signUp); // breakpoint 3
}
这是强制无效状态的SignUp()
函数:
public bool SignUp(SignUpModel signUp)
{
signUp.ForceInvalid();
return false;
}
这是SignUpModel
internal void ForceInvalid() => Validation.IsDuplicateEmail = true;
这是我用于电子邮件的验证属性类:
class EmailExistsAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (validationContext.ObjectInstance is SignUpModel signUp && signUp.Validation.IsDuplicateEmail)
new ValidationResult("Email already exists"); // breakpoint 2
return ValidationResult.Success;
}
}
我使用过这样的属性:
[EmailExists]
public string Email { get; set; }
代码在断点处按顺序中断:1 2 3.由于代码在2处中断,因此模型状态应该无效。但是在断点3处,ModelState.IsValid
仍为真,并且没有错误。我甚至试过ModelState.Clear()
,尽管在这种情况下没有意义。输出仍然相同。