Ajax.BeginForm带有OnComplete总是更新页面

12

我在MVC中有一个简单的Ajax表单。在AjaxOptions中,OnComplete设置为一个简单的JavaScript函数,它只执行一件事-返回false。

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { UpdateTargetId = "DivFormId", HttpMethod = "Post", OnComplete = "preventUpdate" }))

function preventUpdate(xhr) {
    return false;       
}
问题是,页面已经更新了。例如,在某些情况下,控制器在 postback 后返回部分视图,在其他情况下,它返回一些 JSON 对象。当返回部分视图时,我希望它更新页面,并在返回 JSON 时显示对话框窗口。不幸的是,当返回 JSON 时,即使 OnComplete 函数返回 false(如 MSDN 所述:要取消页面更新,请从 JavaScript 函数返回 false),它也会清除页面(使用 JSON 更新)。
如何根据接收到的响应来防止页面更新?
谢谢!
----- 更新 -------
到目前为止,我找到了以下解决方案。当我不指定 UpdateTargetId 时,我可以手动处理响应。但这仍然不是文档化的行为,配合 return false 使用。

也许这会有所帮助,同时看一下第一个评论 https://dev59.com/RXM_5IYBdhLWcg3wfTO7#1357151 - Garrett Fogerlie
1
这并不是情况(但为了确保,我也尝试了这两种方法)。这是使用 Ajax.BeginForm 时 Microsoft 处理事件(如 OnBegin、OnComplete 等)的方式。根据 MSDN 文档,可以通过返回 false 来停止 OnComplete 事件的执行。 - Jozef Krchňavý
1个回答

23

使用 OnSuccess,并且去掉 UpdateTargetId。像这样:

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "Post", OnSuccess = "foo" }))
{
    ...
}

然后:

function foo(result) {
    if (result.SomePropertyThatExistsInYourJsonObject) {
        // the server returned a JSON object => show the dialog window here
    } else {
        // the server returned a partial view => update the DOM:
        $('#DivFormId').html(result);
    }
}

为了使用Ajax.BeginForm,您需要以下JavaScript文件(在MVC 5模板中不是标准的):jquery.unobtrusive-ajax.js https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.3 - Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接