我有一个名为Account Controller的控制器,它包含我的登录功能。问题是我直接进入索引页面,而不是显示无效登录的模型错误。
在aps.net网站表单中,他们曾经是一个验证组,验证总结与此处相同
[HttpPost]
public async Task<IActionResult> Login(string email, string password, bool rememberMe)
{
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
ModelState.AddModelError(string.Empty, "Invalid login");
return View();
}
if (!user.EmailConfirmed)
{
ModelState.AddModelError(string.Empty, "Confirm your email first");
return View();
}
var passwordSignInResult = await _signInManager.PasswordSignInAsync(user, password, isPersistent: rememberMe, lockoutOnFailure: false);
if (!passwordSignInResult.Succeeded)
{
await _userManager.AccessFailedAsync(user);
ModelState.AddModelError(string.Empty, "Invalid login");
return View();
}
return Redirect("~/");
}
登录页面
<form asp-controller="Account" asp-action="Login" method="post">
<div class="form-group has-feedback">
<input type="email" class="form-control" name="email" id="email" placeholder="Email">
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control" name="password" id="password" placeholder="Password">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="row">
<div class="col-xs-8">
<div class="checkbox icheck">
<label>
<input type="checkbox" name="rememberMe" value="true"> Remember Me
<input type="hidden" name="rememberMe" value="false" />
</label>
</div>
</div>
<!-- /.col -->
<div class="col-xs-4">
<button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button>
</div>
<!-- /.col -->
</div>
</form>
My Startup.cs配置,以防丢失任何内容。
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
答案 0 :(得分:1)
尝试了您的代码,它工作正常,只有在没有错误添加到ModelState时才显示Index页面。
Validionummary仍然存在于ASP.NET Core中,您可以像下面一样使用它。
<form asp-controller="Account" asp-action="Login" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group has-feedback">
<input type="email" class="form-control" name="email" id="email" placeholder="Email">
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
...
</form>
但是作为建议,您可以稍微改进代码而不是代码中的许多return View();
,只需在方法结束前使用此代码return Redirect("~/")
if (!ModelState.IsValid)
return View();
更新:有完整的Login方法代码。
[HttpPost]
public async Task<IActionResult> Login(string email, string password, bool rememberMe)
{
IdentityUser user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
ModelState.AddModelError(string.Empty, "Invalid login");
return View();//this should be kept because if user NULL, PasswordSignInAsync will generate exception
}
if (!user.EmailConfirmed)
{
ModelState.AddModelError(string.Empty, "Confirm your email first");
}
var passwordSignInResult = await _signInManager.PasswordSignInAsync(user, password, isPersistent: rememberMe, lockoutOnFailure: false);
if (!passwordSignInResult.Succeeded)
{
await _userManager.AccessFailedAsync(user);
ModelState.AddModelError(string.Empty, "Invalid login");
}
if (!ModelState.IsValid)
return View();
return Redirect("~/");
}
<强> UPDATE2 强>: 在我看来,在这种情况下处理空电子邮件的最简单方法就是在您的View for email字段中使用 required 属性,如下所示。
<input required type="email" class="form-control" name="email" id="email" placeholder="Email">
此必需属性指定用户必须在提交表单之前填写值,而不输入您无法提交表单的电子邮件的值,因此您不会获得例外。您可以详细了解所需的属性here以及另一个link about form validation(see required attribute section)。