上下文: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 =“刷新”?