为什么Ajax.BeginForm取代了我的整个页面?

syd*_*yos 35 jquery asp.net-mvc-3

上下文:Asp.Net MVC3 w/Razor

我试图在Razor布局(以前的母版页)上放置一个登录表单,这样,当用户超时时,可以提示他/她登录而不被重定向(如在RallyDev中).因此,我在Ajax.BeginForm中创建了一个部分_LogOn.cshtml,其中包含所有必需的东西(用户名等),其中UpdateTargetId指向一个div,该div包含ajax表单内的登录控件.表单回发到AccountsController.RefreshLogOn操作,但显然,包含的页面可能是从不同的控制器呈现的.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>
            }
        }
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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) 
    });">
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 39

Ajax.*ASP.NET MVC 3中的帮助程序使用不显眼的jquery,因此请确保jquery.unobtrusive-ajax.js在视图中引用了该脚本.您还可以使用FireBug查看幕后发生的情况以及表单不发送AJAX请求的原因.

UpdateTargetId = "form"特别是当你的表单有refreshid 时,似乎也很可疑@id = "refresh".你的DOM里面还有其他一些元素id="form"吗?也许你的意思UpdateTargetId = "refresh"


sto*_*tom 6

注意:我的问题是第一次,我引用了错误的 ajax脚本文件jquery.validate.unobtrusive.min.js而不是jquery.unobtrusive-ajax.js最新的jquery版本不起作用, jquery-1.7.1.min.js 对我有用.

我成功进入后试图返回内容

所以这是订单:

<script src="~/js/jquery-1.7.1.min.js"></script>
<script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/jquery.unobtrusive-ajax.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

DarinRichard Everett的帖子得到了帮助.希望有所帮助