MVC контроллер вызывается дважды - PullRequest
30 голосов
/ 01 мая 2010

У меня есть контроллер, который вызывается дважды из вызова 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
);

Это никак не повлияло на создание более симпатичной ссылки.

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

Ответы [ 13 ]

63 голосов
/ 02 мая 2010

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

5 голосов
/ 15 июня 2017

10 часов в погоне за этой ошибкой в ​​проекте Java Spring Maven.

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

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

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

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

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

3 голосов
/ 02 мая 2010

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

2 голосов
/ 20 августа 2015

должен быть HTML-разметка, которая не работает должным образом. пожалуйста, проверьте все изображения. также проверьте

<link rel="icon" href="favicon.ico" type="image/x-icon" />
2 голосов
/ 12 декабря 2014

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

1 голос
/ 19 октября 2016

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

    $('#SaveButton').click(function (event) {
        $("#AttendanceDetailForm").submit();
    });
1 голос
/ 02 мая 2010

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

routes.MapRoute( 
    "Play", // Route name 
    "Play/{id}", // URL with parameters 
    new { controller = "Play", action = "Index" , id = "" } // Parameter defaults 
);
1 голос
/ 01 мая 2010

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

0 голосов
/ 26 октября 2017

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

0 голосов
/ 07 декабря 2016

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

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