在我问这个问题之前,让我澄清一下这个练习的目标是研究/概念证明,所以回答如何改进设计或者有更简单的方法来完成这个,虽然很感激,但可能无助于实现目标.
我正在修改 ASP .Net MVC 4 应用程序的模板,因此登录功能是通过 ajax 请求实现的,该请求仅更新包含登录控件的部分视图,并使页面的其余部分不受干扰。
到目前为止,我所做的如下:
我在局部视图上添加了一个表单,以便可以发布它并用按钮替换操作链接
@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))
{
@Html.ValidationSummary(true)
if (Request.IsAuthenticated)
{
<p>
Hello, @Html.ActionLink(User.Identity.Name, "ChangePassword", "Account", routeValues: null, htmlAttributes: new {@class = "username", title = "Change password"})!
@Html.ActionLink("Log off", "LogOff", "Account")
</p>
}
else
{
<ul>
<li>@Html.LabelFor(m => m.UserName)</li>
<li>@Html.TextBoxFor(m => m.UserName)</li>
<li>@Html.LabelFor(m => m.Password)</li>
<li>@Html.PasswordFor(m => m.Password)</li>
<li><input class="loginLink loginButton" type="button" value="Log in"/></li>
<li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new {id = "registerLink"})</li>
</ul>
}
}
我像这样修改了动作
[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl)
{
ActionResult result = View("_LoginPartial", model);
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
result = Redirect(returnUrl);
}
else
{
result = View("_LoginPartial", model);
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
return result;
}
我创建了这个小的 Javascript 文件
var login = {
callLogin: function () {
var userName = $("#UserName").val();
var password = $("#Password").val();
var data = { UserName: userName, Password: password };
$("#login").load("/Account/Login", data);
}
};
$(document).ready(function () {
$(".loginButton").click(login.callLogin);
});
登录本身有效。正在调用 POST 操作方法并验证凭据。问题是部分视图没有更新,我必须通过转到另一个页面来强制回帖,以便我可以看到部分视图,就好像用户已登录一样。
实现这一目标的缺失要素是什么?
谢谢你。