MVC5:布局页面中的登录表单

时间:2014-03-24 07:23:44

标签: asp.net asp.net-mvc login asp.net-mvc-5 asp.net-identity-2

我对MVC很新,所以请帮助我了解如何执行以下操作。如您所知,当您创建新的MVC5项目时,它希望您在登录时使用“登录”页面作为单独的页面(即,使用ActionLink的_LoginPartial视图返回其View的Login控制器)。

我想要完成的是在整个站点中使用登录表单(当用户尚未登录时),所以我做了以下更改:

_Layout view:

@Html.Partial("_LoginPartial")

_LoginPartial view:

using (Html.BeginForm("Login", "Account", new { ReturnUrl = Request.QueryString["ReturlUrl"] }, FormMethod.Post, new { @class = "navbar-form navbar-right form-inline", role = "form" }))
{
    @Html.AntiForgeryToken()
    <div class="form-group">
        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control input-sm", placeholder = "Username" })
        @Html.PasswordFor(m => m.Password, new { @class = "form-control input-sm", placeholder = "Password" })
    </div>
    <input type="submit" value="Log in" class="btn btn-default btn-sm" />
}

当用户名/密码存在时,它看起来工作正常,它会将用户登录并在QueryString中找不到ReturnUrl时将其重定向到主页。但是,当它无法登录时,它将原始登录视图作为单独的页面加载,因为登录控制器返回其完整视图:

if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }
// If we got this far, something failed, redisplay form
return View(model);

我不希望这样。我希望在所有页面上都有登录表单,并且能够从任何页面登录,只显示用户当前所在页面上的错误,而不是将其重定向到原始登录页面。如果不诉诸javascript / ajax,我该怎么做?

非常感谢!

1 个答案:

答案 0 :(得分:0)

这是因为您的ReturnUrl是帐户/登录。 已在web.config

中设置
<forms loginUrl="~/Account/Login" timeout="2880" />

if (user != null)
{
    await SignInAsync(user, model.RememberMe);
    return RedirectToLocal(returnUrl);
}

所以,要么更改loginurl默认页面,要么在Html.BeginForm()中执行此操作。

ReturnUrl = HttpContext.Current.Request.RawUrl

获取当前请求的页面并为ReturnUrl设置。

using (Html.BeginForm("Login", "Account", new { ReturnUrl = HttpContext.Current.Request.RawUrl }, FormMethod.Post, new { @class = "navbar-form navbar-right form-inline", role = "form" }))
{
    //your code
}
相关问题