Форма отправляется дважды после обновления из ASP MVC 3 Preview до Beta - PullRequest
16 голосов
/ 31 октября 2010

После обновления 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 ]

32 голосов
/ 14 июля 2011

У меня была та же проблема, и я нашел решение: я включил "jquery.unobtrusive-ajax.min.js" -Script дважды: -)

14 голосов
/ 31 октября 2010

Посмотрите на сгенерированный HTML. В ASP.NET MVC 3 Beta появилась новая поддержка ненавязчивого ajax на основе jquery, и все помощники Ajax теперь используют jquery.Может быть, что-то осталось от MS Ajax, что вызывает двойной вызов.Убедитесь, что вы удалили все включения сценариев MSAjax со страницы.Также зачем использовать Ajax.BeginForm, когда вы можете просто использовать Html.BeginForm с ненавязчивым jquery?

7 голосов
/ 10 февраля 2012

Дублирование jquery.unobtrusive-ajax.min.js также может произойти, если ваш контроллер возвращает View() вместо PartialView().

3 голосов
/ 21 июня 2013

У меня была такая же проблема при использовании вызова AJAX.BeginForm, который загружается динамически с использованием $.load() Я решил это, удалив из загруженной формы дополнительное включение jquery.unobtrusive-ajax.min.js . Это ключ!

2 голосов
/ 25 сентября 2015

Только для дальнейшего использования теми, кто использует 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.

его просто пропустить
2 голосов
/ 11 мая 2011

один маленький совет все время, прежде чем использовать .live(), выполните. die():)
это убьет все java-скрипты, прикрепленные к этому событию, и создаст новый.

пример:

$(function() {
    $('#MyInfoForm').die();
    $("#MyInfoForm").live('submit', function(e) {
        //some code
        e.preventDefault();
    });
});
1 голос
/ 05 сентября 2015

Перемещение jquery.unobtrusive-ajax.js вне частичного обзора решило проблему в моем случае.

1 голос
/ 19 марта 2011

Вы можете использовать bind вместо live в jquery.unobtrusive-ajax.min.js ~~~ Это очень важно. Потому что live событие будет вызывать предыдущие события каждый раз, но bind только вызовытекущее событие.

0 голосов
/ 02 мая 2019

это старо, но я нашел что-то действительно глупое, что легко упустить из виду.

К нашей форме также было прикреплено следующее:

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

Очевидно, что .NET-код обрабатывает этосам по себе.

0 голосов
/ 16 января 2014

Я нашел решение, просто удалите все ссылки на jquery.unobtrusive-ajax.js, так как вы используете Ajax.BeginForm, он обычно будет использовать ajax.

Так что не нужно отключать ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...