Форма, отправленная дважды после обновления из ASP MVC 3 Preview to Beta
После обновления 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
, и он запускается дважды, каждый раз, когда я нажимаю кнопку отправки.
Кто-нибудь еще видел это поведение? После обновления я ничего не изменил в коде, и он отлично работал перед обновлением.
Ответы
Ответ 2
У меня была та же проблема, и я нашел решение: дважды включил "jquery.unobtrusive-ajax.min.js
" -Script
: -)
Ответ 3
Дублированный jquery.unobtrusive-ajax.min.js
также может произойти, если ваш контроллер возвращает View()
вместо PartialView()
.
Ответ 4
У меня была такая же проблема, используя вызов AJAX.BeginForm
, который динамически загружается с помощью $.load()
Я решил это, удалив добавочный include jquery.unobtrusive-ajax.min.js в загруженной форме. Это ключ!
Ответ 5
один маленький совет все время, прежде чем использовать .live()
, сделайте. die()
:)
это убьет все сценарии java, прикрепленные к этому событию, и создаст новый.
Пример:
$(function() {
$('#MyInfoForm').die();
$("#MyInfoForm").live('submit', function(e) {
//some code
e.preventDefault();
});
});
Ответ 6
Просто для будущих ссылок для тех, кто использует 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"
устраняет проблему.
Просто опубликуйте это, потому что при поиске unobtrusive-ajax
легко пропустить "~/Scripts/jquery.unobtrusive*"
.
Ответ 7
Вы можете использовать bind
вместо live
в jquery.unobtrusive-ajax.min.js ~~~ Это очень важно. Поскольку событие live
будет вызывать предыдущие события каждый раз, но bind
вызывает только вызовы текущее событие.
Ответ 8
Перемещение jquery.unobtrusive-ajax.js
вне частичного просмотра разрешило проблему в моем случае.
Ответ 9
У меня также была эта точная проблема и по совершенно другой причине. Я включил ссылку script в jquery.unobtrusive-ajax.min.js
в обновленном div. Перемещение его за пределы div зафиксировало его.
Ответ 10
У меня была та же проблема. У меня было частичное представление логина на главной странице, которая включала jquery.unobtrusive-ajax.min.js
. У меня также был этот файл включен в мой взгляд. Поэтому я удалил один, и проблема решена сейчас.
Ответ 11
Это может быть полезно для тех, у кого есть сценарий, похожий на то, что у меня есть:
На моей странице форма редактирования открывает частичный вид внутри модального всплывающего окна Kendo UI, которое динамически загружает код формы, включая jquery.unobtrusive-ajax.js. С этим параметром, который может относиться к любому всплывающему окну, например, к пользовательскому интерфейсу jQuery, а не только к пользовательскому интерфейсу Kendo - поведение отправки формы выглядит следующим образом:
В первый раз, когда всплывающее окно открывается, представление формы вызывает единый вызов на контроллер (серверный) код. Все идет нормально. Однако во второй раз, когда окно открыто (без закрытия страницы контейнера), представление формы вызывает контроллер 2 раза. Впоследствии каждое повторное открытие всплывающего окна вызывает дополнительную загрузку кода jquery.unobtrusive-ajax.js, что, в свою очередь, вызывает дополнительный нежелательный вызов контроллера при каждом отдельном представлении формы.
Чтобы устранить проблему, я переместил включение jquery.unobtrusive-ajax.js из частичного представления всплывающего окна на главную страницу. Однако это привело к тому, что проверка на стороне клиента перестала работать, и, чтобы исправить это, я использовал предоставленное здесь решение: проверка на стороне клиента с добавлением динамически добавленного поля, который ссылается на это сообщение в блоге: http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/
Ответ 12
Я нашел решение, просто удалите все ссылки jquery.unobtrusive-ajax.js, так как вы используете Ajax.BeginForm, он будет обычно использовать ajax.
Поэтому он не должен отключать ajax.
Ответ 13
это старо, но я нашел что-то действительно глупое, что легко упустить из виду.
К нашей форме также прикреплено следующее:
$(document).ready(function () {
$('#submit-button').on('click', function (e) {
....
}
});
Очевидно, что .NET-код обрабатывает это сам.