从ASP MVC 3 Preview更新到Beta后,表单提交了两次

时间:2010-10-31 09:30:41

标签: asp.net-mvc-3

将我的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,并且每次点击我的提交按钮都会被激活两次。

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

13 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:14)

查看生成的HTML。 In ASP.NET MVC 3 Beta新的支持基于不引人注意的基于jquery的ajax,所有Ajax助手现在都使用jquery。也许MS Ajax会留下一些导致双重调用的东西。确保从页面中删除所有MSAjax脚本包含。另外,为什么在只使用Ajax.BeginForm不引人注目的jquery时使用Html.BeginForm呢?

答案 2 :(得分:7)

如果您的控制器返回jquery.unobtrusive-ajax.min.js而不是View(),也会发生重复的PartialView()

答案 3 :(得分:3)

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

答案 4 :(得分:2)

在您使用.live()之前,

一直有一个小提示,请执行。die() :) 这会杀死附加到此事件的所有java脚本,并将创建一个新脚本。

示例:

$(function() {
    $('#MyInfoForm').die();
    $("#MyInfoForm").live('submit', function(e) {
        //some code
        e.preventDefault();
    });
});

答案 5 :(得分: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

答案 6 :(得分:1)

您可以在jquery.unobtrusive-ajax.min.js中使用bind代替live ~~~这非常重要。因为live事件每次都会调用以前的事件但是bind只调用当前事件。

答案 7 :(得分:1)

在部分视图之外移动{{1}}解决了我的问题。

答案 8 :(得分:0)

我也有这个确切的问题,原因很不一样。我已经在更新的div中包含了对jquery.unobtrusive-ajax.min.js的脚本引用。将它移到div外面就固定了它。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

对于拥有类似于我的情景的人来说,这可能会有所帮助:

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

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

为了解决这个问题,我将jquery.unobtrusive-ajax.js的内容从弹出窗口的局部视图移到了主页面。然而,这使得客户端验证停止工作,为了解决这个问题,我使用了此处提供的解决方案: client side validation with dynamically added field链接到此博文: http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/

答案 11 :(得分:0)

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

所以它不必禁用ajax。

答案 12 :(得分:0)

这很老了,但我发现有些愚蠢的东西很容易忽略。

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

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

很明显,.NET代码本身可以处理。