上下文:Asp.Net MVC3 w / Razor
我试图把一个登录表单在Razor布局(以前的主页),这样,当用户超时,他/他可以提示登录而不被重定向(如在RallyDev)。所以,我创建了一个部分_logon.cshtml与所有必要的东西(用户名等)在一个Ajax.BeginForm与UpdateTargetId,指向一个div,其中包含在ajax形式的登录控件。该表单发回到AccountsController.Refreshlogon操作,但显然,包含页面可能已从不同的控制器呈现。 Refreshlogon操作返回PartialView(“_ logon”)。在任何情况下,我的期望/愿望是只有这个div内的控件被替换。发生了什么,而是我的页面位置更改为/ Accounts / Refreshlogon,整个页面替换为partial。有没有另一种方法,我应该采取?
以下是相关代码:
_logon.cshtml
@{ using (Ajax.BeginForm("Refreshlogon","Accounts",new AjaxOptions { OnSuccess = "logonSucceeded",OnFailure = "logonFailed",HttpMethod = "Post",UpdateTargetId = "user-info" },new { @id = "refresh"})) { @Html.AntiForgeryToken() <div id="user-info"> <p>Your session has expired.</p> <div class="error">@Html.ValidationSummary()</div> <table> <tr> <td>Username:</td> <td>@Html.TextBoxFor(model => model.UserName)</td> </tr> <tr> <td>Password:</td> <td>@Html.PasswordFor(model => model.Password)</td> </tr> <tr> <td>Remember Me:</td> <td>@Html.CheckBoxFor(model => model.RememberMe)</td> </tr> </table> </div> } }
AccountsController
public ActionResult Refreshlogon (logonModel model) { if (ModelState.IsValid) { if (MembershipService.ValidateUser(model.UserName,model.Password)) { ...content elided... return PartialView("_logon"); } ModelState.AddModelError("",ErrorMessages.IncorrectUsernameOrPassword); } return PartialView("_logon",model); }
<form action="/Accounts/Refreshlogon" id="refresh" method="post" onclick="Sys.Mvc.AsyncForm.handleClick(this,new Sys.UI.DomEvent(event));" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this,new Sys.UI.DomEvent(event),{ insertionMode: Sys.Mvc.InsertionMode.replace,httpMethod: 'Post',updateTargetId: 'user-info',onFailure: Function.createDelegate(this,logonFailed),onSuccess: Function.createDelegate(this,logonSucceeded) });">
解决方法
Ajax。* ASP.NET MVC 3中的helpers使用不显眼的jquery,因此请确保您在视图中引用了jquery.unobtrusive-ajax.js脚本。还可以使用
FireBug来查看在这些场景下发生了什么,以及为什么表单不发送AJAX请求。
此外,UpdateTargetId =“form”似乎是可疑的,特别是当你的表单有刷新id:@id =“refresh”。在你的DOM里面有一些其他元素,id =“form”?也许你的意思是UpdateTargetId =“刷新”?