将我的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
,并且每次点击我的提交按钮都会被激活两次。
其他人看到过这种行为?升级后我没有更改代码中的任何内容,并且在升级之前它完美运行。
答案 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代码本身可以处理。