Действие ASP.NET MVC вызывается дважды
У меня есть определенное действие контроллера, которое вызывается дважды, что, кроме того, что это странно, вызывает проблемы с одноэлементной частью моего приложения (на самом деле это не проблема, это просто привело к двойному вызову).
Любая идея, почему действие контроллера будет выполняться два раза каждый раз?
Ответы
Ответ 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]
к моему действию, и проблема была решена.