在我問這個問題之前,讓我澄清一下,這個練習的目的是研究/概念證明,以便回答關於如何改進設計或有更簡單的方法來實現這一點,雖然讚賞,可能無助於實現目標。使用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