ModelState IsValid returns False 使用 ASP.NET Core 5 MVC Identity with UserName
ModelState IsValid returns False Using ASP.NET Core 5 MVC Identity with UserName
我正在尝试使用用户名而不是电子邮件登录来完成登录功能。
我正在使用 Bootstrap 模式对话框登录用户,jquery 和 ajax 用于错误处理。
UserName 不是电子邮件地址,因此 ModelState IsValid 始终 returns false。如果我在 javascrip 文件中硬编码一个电子邮件地址,那么一切正常。
有没有关于这个问题的。任何帮助将不胜感激。
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Login</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="UserLoginForm" asp-controller="UserAuth" asp-action="login">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="LoginInValid" />
<div class="form-group row mb-3">
<label asp-for="UserName" class="col-md-4 col-form-label"></label>
<div class="col-md-8">
<input asp-for="UserName" placeholder="User Name" class="form-control" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="form-group row mb-3">
<label asp-for="Password" class="col-md-4 col-form-label"></label>
<div class="col-md-8">
<input asp-for="Password" placeholder="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="form-group-row">
<div class="col-md-8 offset-md-4">
<div class="form-check">
<input asp-for="RememberMe" class="form-check-input" />
<label asp-for="RememberMe" class="col-md-4" col-form-label"></label>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" id="login" name="login" class="btn btn-primary">Login</button>
</div>
</div>
[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel loginModel)
{
loginModel.LoginInValid = "true";
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(loginModel.UserName, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
loginModel.LoginInValid = "";
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt");
}
}
return PartialView("_UserLoginPartial", loginModel);
}
不显示错误处理
(function () {
var userloginButton = $("#UserLoginModal button[name='login']").click(onUserLoginClick);
function onUserLoginClick() {
var url = "UserAuth/Login";
var antiForgeryToken = $("#UserLoginModal input[name='__RequestVerificationToken']").val();
var username = $("#UserLoginModal input[name = 'UserName']").val();
var email = "mydomain.com"
/*var email = $("#UserLoginModal input[name = 'Email']").val();*/
var password = $("#UserLoginModal input[name = 'Password']").val();
var rememberMe = $("#UserLoginModal input[name = 'RememberMe']").prop('checked');
var userInput = {
__RequestVerificationToken: antiForgeryToken,
UserName: username,
Email: email,
Password: password,
RememeberMe: rememberMe
};
}
});
登录模型
public class LoginModel
{
[Required]
[Display(Name = "User Name")]
[StringLength(25, MinimumLength = 2)]
public string UserName { get; set; }
[Required]
[StringLength(100, MinimumLength = 2)]
[EmailAddress]
public string Email { get; set; }
[Required]
[StringLength (100, MinimumLength = 2)]
[DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
public string LoginInValid { get; set; }
}
LoginModel 的 UserName、Email 和 Password 都标记为“必需”,因此除非提供所有,否则 ModelState 将无效。
您需要为其中的每一个提供值(我在您的 HTML 标记中没有看到任何电子邮件输入),或者从您不需要的 LoginModel 属性中删除 [Required] 注释想提供。
我正在尝试使用用户名而不是电子邮件登录来完成登录功能。
我正在使用 Bootstrap 模式对话框登录用户,jquery 和 ajax 用于错误处理。
UserName 不是电子邮件地址,因此 ModelState IsValid 始终 returns false。如果我在 javascrip 文件中硬编码一个电子邮件地址,那么一切正常。
有没有关于这个问题的。任何帮助将不胜感激。
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Login</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="UserLoginForm" asp-controller="UserAuth" asp-action="login">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="LoginInValid" />
<div class="form-group row mb-3">
<label asp-for="UserName" class="col-md-4 col-form-label"></label>
<div class="col-md-8">
<input asp-for="UserName" placeholder="User Name" class="form-control" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="form-group row mb-3">
<label asp-for="Password" class="col-md-4 col-form-label"></label>
<div class="col-md-8">
<input asp-for="Password" placeholder="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="form-group-row">
<div class="col-md-8 offset-md-4">
<div class="form-check">
<input asp-for="RememberMe" class="form-check-input" />
<label asp-for="RememberMe" class="col-md-4" col-form-label"></label>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" id="login" name="login" class="btn btn-primary">Login</button>
</div>
</div>
[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel loginModel)
{
loginModel.LoginInValid = "true";
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(loginModel.UserName, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
loginModel.LoginInValid = "";
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt");
}
}
return PartialView("_UserLoginPartial", loginModel);
}
不显示错误处理
(function () {
var userloginButton = $("#UserLoginModal button[name='login']").click(onUserLoginClick);
function onUserLoginClick() {
var url = "UserAuth/Login";
var antiForgeryToken = $("#UserLoginModal input[name='__RequestVerificationToken']").val();
var username = $("#UserLoginModal input[name = 'UserName']").val();
var email = "mydomain.com"
/*var email = $("#UserLoginModal input[name = 'Email']").val();*/
var password = $("#UserLoginModal input[name = 'Password']").val();
var rememberMe = $("#UserLoginModal input[name = 'RememberMe']").prop('checked');
var userInput = {
__RequestVerificationToken: antiForgeryToken,
UserName: username,
Email: email,
Password: password,
RememeberMe: rememberMe
};
}
});
登录模型
public class LoginModel
{
[Required]
[Display(Name = "User Name")]
[StringLength(25, MinimumLength = 2)]
public string UserName { get; set; }
[Required]
[StringLength(100, MinimumLength = 2)]
[EmailAddress]
public string Email { get; set; }
[Required]
[StringLength (100, MinimumLength = 2)]
[DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
public string LoginInValid { get; set; }
}
LoginModel 的 UserName、Email 和 Password 都标记为“必需”,因此除非提供所有,否则 ModelState 将无效。
您需要为其中的每一个提供值(我在您的 HTML 标记中没有看到任何电子邮件输入),或者从您不需要的 LoginModel 属性中删除 [Required] 注释想提供。