16

将我的 ASP MVC 从 3 Preview 升级到 3 Beta 后,我在 Ajax 表单中看到了奇怪的行为。

@using(Ajax.BeginForm("New", new AjaxOptions() {OnSuccess = "onAjaxSuccess", OnFailure = "onAjaxFailure", OnBegin = "onAjaxBegin", HttpMethod = "Post"})) {}

<form action="/Order/New" data-ajax="true" data-ajax-begin="onAjaxBegin" data-ajax-failure="onAjaxFailure" data-ajax-method="Post" data-ajax-success="onAjaxSuccess" method="post"></form>

alert在我的函数中放置了一个onAjaxBegin,每次点击我的提交按钮时,它都会被触发两次。

其他人看到这种行为吗?升级后我没有更改代码中的任何内容,并且在升级之前它运行良好。

4

13 回答 13

33

我遇到了同样的问题,我找到了解决方案:我包含了两次“ jquery.unobtrusive-ajax.min.js-Script:-)

于 2011-07-14T15:56:13.827 回答
14

查看生成的 HTML。在 ASP.NET MVC 3 Beta中有对基于 jquery 的不显眼的 ajax 的新支持,并且所有 Ajax 助手现在都使用 jquery。也许 MS Ajax 留下了一些东西,导致了双重调用。确保从页面中删除所有包含的 MSAjax 脚本。Ajax.BeginForm另外,当您可以简单地Html.BeginForm与不显眼的 jquery 一起使用时,为什么还要使用?

于 2010-10-31T09:33:43.363 回答
7

如果jquery.unobtrusive-ajax.min.js您的控制器返回 aView()而不是PartialView().

于 2012-02-09T22:14:56.357 回答
3

AJAX.BeginForm我在使用动态加载的调用时遇到了同样的问题,我通过在加载的表单上删除jquery.unobtrusive-ajax.min.js$.load() 的额外包含来解决它。这就是关键!

于 2013-06-21T14:10:07.547 回答
2

在你使用之前一直有一个小技巧.live(),做。die():)
这将杀死所有附加到此事件的 java 脚本并创建一个新脚本。

例子:

$(function() {
    $('#MyInfoForm').die();
    $("#MyInfoForm").live('submit', function(e) {
        //some code
        e.preventDefault();
    });
});
于 2011-05-10T21:33:44.603 回答
2

仅供使用 ASP.NET MVC 的人将来参考;"~/Scripts/jquery.unobtrusive*"还包括. _"~/Scripts/jquery.unobtrusive-ajax.js"

所以如果你BundleConfig看起来像这样;

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js",
                    "~/Scripts/jquery.unobtrusive-ajax.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.unobtrusive*",
                    "~/Scripts/jquery.validate*"));

这将导致提交 Ajax 表单两次。删除"~/Scripts/jquery.unobtrusive*""~/Scripts/jquery.unobtrusive-ajax.js"将解决问题。

只是发布这个,因为它很容易"~/Scripts/jquery.unobtrusive*"在搜索时被忽略unobtrusive-ajax

于 2015-09-25T09:00:31.533 回答
1

可以在jquery.unobtrusive-ajax.min.js中使用bind代替live~~~这个很重要。live因为事件每次都会调用之前的事件而bind只调用当前的事件。

于 2011-03-19T03:46:21.003 回答
1

移出jquery.unobtrusive-ajax.js局部视图解决了我的问题。

于 2015-09-04T21:39:43.823 回答
0

我也有这个确切的问题,原因非常不同。我已将脚本引用包含在jquery.unobtrusive-ajax.min.js已更新的 div 中。将它移到 div 之外修复它。

于 2011-09-26T11:37:55.140 回答
0

我有同样的问题。我在母版页中有一个登录部分视图,其中包括jquery.unobtrusive-ajax.min.js. 我的视图中也包含了这个文件。所以我删除了一个,问题现在解决了。

于 2013-01-22T06:30:52.113 回答
0

这可能对遇到类似于我的情况的人有所帮助:

在我的页面上,编辑表单会在 Kendo UI 模式弹出窗口内打开一个局部视图,该窗口会动态加载表单的代码,包括 jquery.unobtrusive-ajax.js。使用此设置, - 可以与任何弹出窗口相关,例如 jQuery UI 而不仅仅是 Kendo UI - 表单提交的行为如下:

第一次打开弹出窗口时,表单提交会导致对控制器(服务器端)代码的一次调用。到现在为止还挺好。但是,第二次打开窗口(没有关闭容器页面),表单提交调用了控制器 2 次。随后,弹出窗口的每次重新打开都会导致 jquery.unobtrusive-ajax.js 代码的额外加载,这反过来又会导致在每次提交表单时对控制器进行额外的不必要的调用。

为了解决这个问题,我将 jquery.unobtrusive-ajax.js 的包含从弹出窗口的部分视图移到了主页面。然而,这使得客户端验证停止工作,为了解决这个问题,我使用了此处提供的解决方案: 客户端验证与动态添加的字段链接到此博客文章:http: //xhalent.wordpress.com/2011/ 01/24/应用不显眼的验证到动态内容/

于 2013-06-16T01:45:37.447 回答
0

我找到了解决方案,只需删除所有 jquery.unobtrusive-ajax.js 引用,因为您使用的是 Ajax.BeginForm 它将正常使用 ajax。

所以它不必禁用ajax。

于 2014-01-16T14:53:15.340 回答
0

这是旧的,但我发现了一些很容易忽略的非常愚蠢的东西。

我们的表格还附有以下内容:

$(document).ready(function () {
    $('#submit-button').on('click', function (e) {
        ....
    }
});

显然,.NET 代码自己处理这个问题。

于 2019-05-02T12:11:11.823 回答