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

Контроллер MVC вызывается дважды

У меня есть контроллер, который вызывается дважды из вызова ActionLink.

На моей домашней странице есть ссылка, которая при нажатии вызывает метод Index на контроллере Play. Идентификатор 100 передается в метод. Я думаю, что это является причиной проблемы. Подробнее об этом ниже.

Вот некоторые фрагменты кода:

Домашняя страница:

<%= Html.ActionLink("Click Me", "Index", "Play", new { id = 100 }, null) %>

Контроллер воспроизведения:

public ActionResult Index(int? id)
{
    var settings = new Dictionary<string, string>();
    settings.Add("Id", id.ToString());
    ViewData["InitParams"] = settings.ToInitParams();
    return View();
}

Просмотр воспроизведения:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

(html <head> omitted for brevity)

<body>
    <form id="form1" runat="server" style="height:100%">
        Hello
    </form>
</body>

Если я избавлюсь от параметра метода Index, все будет хорошо. Если я оставлю параметр на месте, то вызывается метод Index с идентификатором 100. После возврата View метод вызывается второй раз с параметром null.

Кажется, я не могу понять, что вызывает второй звонок.

Моей первой мыслью было добавить конкретный маршрут, подобный этому:

routes.MapRoute(
    "Play", // Route name
    "Play/{id}", // URL with parameters
    new {controller = "Play", action = "Index"} // Parameter defaults
);

Это не имело никакого эффекта, кроме создания привлекательной ссылки.

Я не уверен, куда идти отсюда.

4b9b3361

Ответ 1

Есть ли какая-либо другая разметка, которая может случайно ссылаться на страницу? Script ссылки, ссылки на изображения, ссылки css, все могут быть ошибочно указаны на '.' или текущей страницы.

Ответ 2

10 часов преследуют эту ошибку в проекте Java Spring Maven.

Сначала на SELECT я думал, что Hibernate просто регистрировался дважды, но затем с INSERT я думал, что запросы вызывались дважды. Пройдя через код, который я обнаружил, контроллер дважды вызывался...

Пробовал всю возможную конфигурацию Spring, считая, что контекст был загружен дважды, или bean дважды повторялся...

В отчаянии перестроил проект по частям, чтобы, наконец, добавить фрагмент HTML и ошибки kaboom.

<img alt="" src="#" />

Резкий знак был виноват, перезагружая URL. Я знаю, что тема старая, но я обобщил свои поиски со словами, которые я тщетно искал в Интернете, чтобы найти ответ на ту же проблему! Может помочь другим...

Ответ 3

Вы можете просмотреть код в своем представлении. Пройдите и посмотрите, откуда приходит второй вызов.

Ответ 4

Во время отладки я узнал, что Partial View вызывает вызов контроллера во второй раз. Это отстой, но я не вижу работы вокруг этого.

Ответ 5

должен быть html markeup, который не работает должным образом. проверьте все img tage. также проверьте

<link rel="icon" href="favicon.ico" type="image/x-icon" />

Ответ 6

Попробуйте изменить int? id на int id. Это соответствует маршруту второй раз, потому что вы снова вызываете индекс с нулевым идентификатором.

Ответ 7

Вы также можете попробовать изменить маршрут к этому.

routes.MapRoute( 
    "Play", // Route name 
    "Play/{id}", // URL with parameters 
    new { controller = "Play", action = "Index" , id = "" } // Parameter defaults 
);

Ответ 8

Что-то очень глупое, что у меня было... было 2 формы на странице с одной кнопкой на каждой форме. Я добавил script, чтобы отправить конкретную форму на основе нажатой кнопки, но поскольку действие по умолчанию кнопки в форме состоит в том, чтобы сделать submit, она дважды вызывала мое действие контроллера.: ^ (

    $('#SaveButton').click(function (event) {
        $("#AttendanceDetailForm").submit();
    });

Ответ 9

Я тоже столкнулся с той же проблемой. после тщательной проверки моего проекта, я не нашел такого пустого справочного примера. Затем я узнал, что это вызвано FireBug. Отключение firebug или использование другого браузера, у которого не установлен firebug, решила проблему.

Ответ 10

У меня была такая же проблема, и я проверил все возможные предложения, но не повезло, но я заметил следующее предупреждающее сообщение JS на моей консоли.

Синхронный XMLHttpRequest в основном потоке устарел из-за его пагубные последствия для конечного пользователя. Для получения дополнительной помощи проверьте https://xhr.spec.whatwg.org/.

xmlHttp = new XMLHttpRequest();

Я исправил это, и он работает для меня.

Позаботьтесь обо всех предупреждениях js и .

Это может помочь кому-то.

Ответ 11

Моя проблема была решена, если я не был двойным ссылкой на мои файлы JavaScript, которые я был.

Это вызвало двойное действие, когда я нажал ссылку.

Я знаю, что выше было сказано ранее, но я думал, что хочу отметить, что стоит проверить, загружаются ли ваши файлы дважды, особенно если вы используете Partial Views.

Я заметил, что в одном из моих Partial Views я говорил ему использовать главную страницу макета, в которой содержались сценарии, которые отвечали за то, что произошло, когда я нажал на ссылки. Поэтому я исправил это, просто установив layout = null;, так как это частичный вид, и он уже загружается внутри основного макета.

Ответ 12

В моем случае я использовал Partial View (т.е. теги формы) и использовал обработчик on-click в JQuery для вызова метода в контроллере через Ajax. Но я сказал, что кнопка, к которой был прикреплен обработчик, была прикреплена как тип Submit. Я забыл передать e в функцию моего обработчика, чтобы вызвать e.PreventDefault()!! Поэтому метод Controller вызывался дважды - один раз из ajax-вызова и один раз для Submit. Второй раз по параметрам был нулевым. Это вызвало у меня столько горя. Такая маленькая вещь. Такой маленький, что его легко упустить. Надеюсь, это поможет кому-то еще.

Ответ 13

В моем случае было неправильно настроено удаленное script Yandex.metrika(аналог Google Analytics). Этот script был представлен на каждой странице, поэтому любой контроллер и любое действие вызывались дважды. Проверьте настройки Ya.metrika для более подробной информации.

Ответ 14

Это старый вопрос, и некоторые ответы все еще полезны. Вот почему я добавляю новый ответ, надеясь, что это поможет кому-то еще. Для меня у меня есть приложение, которое перенаправляет пользователей назад и вперед между моими доменами. Из-за некоторых моих недавних работ, связанных с HttpCookie, я добавил строку кода ниже:

httpCookieObject.SameSite = SameSiteMode.Strict;

Оказывается, SameSiteMode.Strict вызывает проблемы, когда речь идет о схемах проверки подлинности между источниками. Это документация Microsoft об этом: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2

Для строгого соблюдения политики SameSiteMode.Strict для одного и того же сайта установите MinimumSameSitePolicy. Хотя этот параметр нарушает OAuth2 и другие схемы аутентификации между источниками, он повышает уровень безопасности файлов cookie для других типов приложений, которые не зависят от обработки запросов между источниками.

Итак, мое решение состояло в том, что я не использую политику SameSiteMode.Strict, и я готов идти вперед.