我对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,我该怎么做?
非常感谢!
答案 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
}