我有简单的登录表单。
除了一件事,一切都很好。当您进入页面时,它总是显示验证(例如,字段是必需的),即使没有数据被发送到控制器。
有没有办法只在实际发出POST请求时显示验证?
查看:
@model LoginViewModel
<form asp-controller="User" asp-action="Login" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<label asp-for="Email"></label>
<input asp-for="Email" />
<span asp-validation-for="Email"></span>
<label asp-for="Password"></label>
<input asp-for="Password" />
<span asp-validation-for="Password"></span>
<button type="submit">Login</button>
</form>
视图模型:
public class LoginViewModel
{
[Required]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
动作:
[HttpGet]
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model)
{
ClaimsPrincipal userClaims = _userRepository.TryLogin(model);
if (userClaims != null)
{
...
}
return View(model);
}
答案 0 :(得分:3)
正如Paul在评论中提到的那样,您应该删除[Get]
属性,该属性将阻止对操作的Get请求,而是创建一个新的控制器操作,负责处理不会导致请求的请求动作的模型LoginViewModel
为空。
例如:
[AllowAnonymous]
public async Task<IActionResult> Login()
{
return View(new LoginViewModel());
}
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model)
{
ClaimsPrincipal userClaims = _userRepository.TryLogin(model);
if (userClaims != null)
{
...
}
return View(model);
}
现在,您的验证只会因无效的帖子模型而触发。