0

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

我想要完成的是在整个网站上都有登录表单(当用户尚未登录时)所以我做了以下更改:

_布局视图:

@Html.Partial("_LoginPartial")

_Login部分视图:

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,我将如何做到这一点?

非常感谢!

4

1 回答 1

0

这是因为您的 ReturnUrl 是 Account/Login。已在 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
}
于 2014-03-24T07:46:08.290 回答