jquery - 为什么 Ajax.BeginForm 会替换我的整个页面?

标签 jquery asp.net-mvc-3

上下文:Asp.Net MVC3 w/Razor

我试图在 Razor 布局(以前的母版页)上放置一个登录表单,以便当用户超时时,可以提示他/她登录而不会被重定向(如 RallyDev 中那样)。因此,我在 Ajax.BeginForm 中创建了一个部分 _LogOn.cshtml,其中包含所有必需的内容(用户名等),其中 UpdateTargetId 指向一个 div,该 div 包含 ajax 表单中的登录控件。该表单回发到 AccountsController.RefreshLogOn 操作,但显然,包含的页面可能是从不同的 Controller 呈现的。 RefreshLogOn 操作返回 PartialView("_LogOn")。无论如何,我的期望/愿望是只替换该 div 内的控件。相反,我的页面位置更改为/Accounts/RefreshLogon,并且整个页面被部分页面替换。我应该采取另一种方法吗?

相关代码如下:

_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>
            }
        }

账户 Controller

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);
}

Ajax.BeginForm --> 生成的表单标签:

<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: &#39;Post&#39;, 
    updateTargetId: &#39;user-info&#39;, 
    onFailure: Function.createDelegate(this, logonFailed), 
    onSuccess: Function.createDelegate(this, logonSucceeded) 
    });">

最佳答案

ASP.NET MVC 3 中的

Ajax.* 帮助程序使用不显眼的 jquery,因此请确保您已在 View 中引用 jquery.unobtrusive-ajax.js 脚本。您也可以使用 FireBug查看幕后发生的情况以及表单不发送 AJAX 请求的原因。

此外,UpdateTargetId = "form" 似乎也很可疑,尤其是当您的表单具有 refresh ID:@id = "refresh" 时。您的 DOM 中是否还有其他带有 id="form" 的元素?也许您的意思是 UpdateTargetId = "refresh"

关于jquery - 为什么 Ajax.BeginForm 会替换我的整个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4961157/

相关文章:

javascript - 保持一个元素固定,并允许其他元素在移动浏览器地址栏向上滚动时折叠时滚动

javascript - 将脚本插入 iFrame 的页眉,而不清除 iFrame 的主体

asp.net-mvc-3 - MVC3 AllowHtml 属性的问题

jquery - 使用 jQuery Validate 进行验证并执行 AJAX 调用以返回部分 View

javascript - 如何使用 jquery 将文本从一个页面复制并粘贴到另一个页面?

javascript - 获取被溢出部分隐藏的 HTML 元素的完整高度 :Hidden With JQuery/Javascript

javascript - $.inArray 不适用于对象 JavaScript 对象有其他选择吗?

c# - 编辑可变长度列表 ASP.NET MVC 3

c# - C# MVC3 中的复杂 URL

asp.net-mvc - MVC 帮助程序 - 使用 @URL 作为图像 src?