验证消息未在登录页面上显示

时间:2017-07-28 14:27:05

标签: asp.net-core

我有一个名为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?}");
        });


    }

1 个答案:

答案 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>

当我使用此代码时,页面上显示的错误没有任何问题。 enter image description here

但是作为建议,您可以稍微改进代码而不是代码中的许多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)

相关问题