Подтвердить что ты не робот

Действие ASP.NET MVC вызывается дважды

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

Любая идея, почему действие контроллера будет выполняться два раза каждый раз?

4b9b3361

Ответ 1

Не возвращать false или предотвращать действие по умолчанию в событии в обработчике кликов JavaScript по ссылке, которая делает вызов через AJAX. В этом случае он также примет действие по умолчанию для ссылки (то есть сообщение, отличное от AJAX, к тому же URL-адресу).

Исх.

<%= Html.ActionLink( "action", "controller" ) %>


$(function() {
   $('a').on('click', function(e) {
      // solve with "e.preventDefault();" here
      var href = $(this).attr('href');
      $.get(href, function() { ... });
      // or solve with "return false;" here to prevent double request
   });
}):

Ответ 2

У меня была аналогичная проблема. Проблема была вызвана этой строкой в ​​файле _Layout.cshtml:

<link rel="shortcut icon" href="">

После удаления указанной строки мои действия вызывают один раз.

Ответ 3

Очень поздно, но я обнаружил, что имея

<img id="myLogo" src="#"/> 

заставил это сделать это снова сделать звонок. Надеюсь, это кому-то поможет, причина, по которой я не уверен.

Нашел решение здесь. http://skonakanchi.blogspot.com/2011/09/action-method-calling-twice-in-aspnet.html

Ответ 4

Это уже поздно, но, возможно, это кому-то поможет.

Моя проблема была похожа (метод контроллера срабатывает один раз при начальной загрузке, а затем снова запускается сразу же асинхронно).

Я смог проверить объект HttpContext.request и определил, что второй запрос был вызван функцией Visual Studio "Ссылка на браузер".

Я отключил Browser Link, и таинственный вызов ajax для моего метода контроллера больше не происходит.

Как отключить ссылку браузера

Ответ 5

В моем конкретном случае это была загрузка файла jquery.unobtrusive-ajax.min.js дважды.
Это вызывало $(document).ready(function() { });, выполняемая два раза.

Надеюсь, что это будет полезно.

Ответ 6

Я делюсь своим опытом, если он кому-то служит, у меня было следующее неудобное

кнопка отправки

<button type="submit" class="gb-btn-outline-primary margin-top-s" id="btnProcess">
   <i class="fas fa-play margin-right-xs"></i> Procesar
 </button>

что он назвал следующую функцию Javascript

$(function () {
            $('#btnProcess').click(function (e) {
                var plantID = $("#plantID option:selected").val();                    
           if (plantID == "" || plantID == null || plantID == 0) {
                showMessage("2", "Seleccione la planta");
                e.preventDefault();
            }else{
                    var plant = $('#plantID option:selected').text();
                    $("#PlantName").val(plant);
                    var unit = $('#UnitID option:selected').text();
                    $("#UnitName").val(unit);
                    $("#remakeAudit").val(false);
                    $("#frmSearch").submit();
            }
            });
        });

проблема в том, что я дважды вызывал действие из-за щелчка по функции и отправки в этой строке → $ ("# frmSearch"). submit();

решение проблемы состояло в том, чтобы избежать по умолчанию события click функции с помощью e.preventDefault();

следующим образом:

   $(function () {
        $('#btnProcess').click(function (e) {
         e.preventDefault(); //<<---
         var plantID = $("#plantID option:selected").val();                    
        if (plantID == "" || plantID == null || plantID == 0) {
            showMessage("2", "Seleccione la planta");
            e.preventDefault();
        }else{
                var plant = $('#plantID option:selected').text();
                $("#PlantName").val(plant);
                var unit = $('#UnitID option:selected').text();
                $("#UnitName").val(unit);
                $("#remakeAudit").val(false);
                $("#frmSearch").submit();
        }
        });
    });

Ответ 7

Использование сетки кендо эта проблема произошла. использовать опцию grid AutoBind (false)..

Ответ 8

Удалить аргумент с нулевым аргументом из представления

public ActionResult Edit(int? id)

to

public ActionResult Edit(int id)

Ответ 9

Моя проблема заключалась в том, что я случайно включил recaptcha/api.js форму формы Google дважды. Один в BaseLayout и один в представлении.

Ответ 10

У меня была похожая проблема. Проблема была вызвана этой строкой в частичном файле view.cshtml:

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

после удаления это исправлено.

Ответ 11

В моем контроллере метод A вызывает метод B. Было очевидно, что они вызывались дважды. Я подтвердил это, написав в окне вывода. Интересно, что сказано:

Method A was called.
Method A was called.
Method B was called. 
Method B was called.

Я бы ожидал A, B, A, B. Кроме того, несмотря на двойные вызовы, я получил XHR.statusText только один раз. Я знаю, потому что этот текст автоматически добавляется в таблицу в браузере.

В любом случае, проблема связана с jquery.form.js. Я использую его для включения загрузки файлов AJAX.

В документации сказано, что при инициализации подключения jquery.form.js к вашей HTML-форме во время $ (document).ready() вы можете добавить опцию, называемую "url". Если вы этого не сделаете, по умолчанию используется ДЕЙСТВИЕ вашей формы.

Я полагался на дефолт и получал двойные звонки.

Проблема ушла, когда я добавил опцию url и удалил действие из тега формы.

Ответ 12

Используйте это, если ссылка на ярлык является проблемой:

<link rel="shortcut icon" href="javascript:void(0)" />

Ответ 13

В моем случае мне просто нужно было добавить [HttpPost] к моему действию, и проблема была решена.