在我问这个问题之前,让我澄清一下,这个练习的目的是研究/概念证明,以便回答关于如何改进设计或有更简单的方法来实现这一点,虽然赞赏,可能无助于实现目标。使用Ajax在ASP .Net MVC 4中调用登录功能局部视图
我正在修改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操作方法并验证凭据。问题是部分视图没有被更新,我必须通过转到另一个页面强制回发,以便我可以看到部分,就好像用户登录一样。
什么是缺少的成分完成这个?
谢谢。
谢谢乔希。不幸的是,这并没有奏效。该部分封装在具有“登录”ID的元素中。在加载方法中添加选择器不会导致任何不同。 –
2012-08-16 21:11:11
更新的答案反映评论,增加了另一种方法 – 2012-08-16 21:55:45
非常感谢乔希。我找到的解决方案是因为实际需要load方法中的“form”选择器,否则完整的Index视图将呈现在“section”元素中。给你一个这个投票。仍尝试了其他建议,但他们不起作用。 – 2012-08-16 22:07:26