C# .NET核心:始终显示验证错误
我有简单的登录表单。C# .NET核心:始终显示验证错误,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我有简单的登录表单。 除了一件事,一切都很好。当您进入该页面时,它始终显示验证(例如,字段是必需的),即使没有数据发布到控制器。 是否只有在实际发出POST请求时才能显示验证 查看: @model LoginViewModel <form asp-controller="User" asp-action="Login" method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"&g
除了一件事,一切都很好。当您进入该页面时,它始终显示验证(例如,字段是必需的),即使没有数据发布到控制器。
是否只有在实际发出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);
}
行动:
@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);
}
[HttpGet]
[HttpPost]
[异名]
公共异步任务登录(LoginViewModel模型)
{
ClaimsPrincipal userClaims=\u userRepository.TryLogin(模型);
if(userClaims!=null)
{
...
}
返回视图(模型);
}
正如Paul在评论中提到的那样,您应该删除[Get]
属性,该属性将阻止对操作的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);
}
[AllowAnonymous]
公共异步任务登录()
{
返回视图(新的LoginViewModel());
}
[HttpPost]
[异名]
公共异步任务登录(LoginViewModel模型)
{
ClaimsPrincipal userClaims=\u userRepository.TryLogin(模型);
if(userClaims!=null)
{
...
}
返回视图(模型);
}
现在,您的验证只会因无效的post模型而触发。。。。。尝试从登录功能中取出
[HttpGet]
。谢谢!这就成功了。我想把它保持在一个动作中,但这种方法至少有效:)很高兴它起了作用。将命令与查询(post和get)分离通常可以使事情更易于维护。更不用说让一种方法同时处理post和get将违反单一责任原则。