2010-05-01 2 views
27

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

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

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

Главная страница:

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

Play Контроллер:

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> 

Если я избавиться от параметр Индекс me это все хорошо. Если я оставлю параметр на месте, то метод Index вызывается со 100 как id. После возвращения представления метод вызывается второй раз с параметром null.

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

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

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

Это не имело никакого эффекта, чем сделать покрасивее ищет ссылку.

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

Заранее спасибо.

Рик

+0

Можете ли вы проверить firebug, если URL-адрес запрашивается дважды? –

ответ

58

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

+0

это, вероятно, преступник. –

+2

Оказалось, что ошибка javascript «не удалось найти файл» вызывала загрузку страницы дважды. Благодаря! – rboarman

+31

У меня была такая же проблема. В моем случае это был тег с src = "", чтобы я мог загружать изображение динамически позже. Принял немало усилий, чтобы отследить это. Исправлено - полностью удалить атрибут src. –

1

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

1

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

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

Вы можете ввести код, который отображается на вашем экране. Пройдите и посмотрите, откуда приходит второй звонок.

+1

Это сработало для меня после момента путаницы. Оказывается, я повторно перенаправлял форму входа в систему, и на этом перенаправлении я настраивал новое представление с тем же макетом, заставляя его визуализировать дважды. Найдите MasterName и посмотрите, где вы можете форсировать имя макета. – ScottCate

2

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

+0

У меня такая же проблема. Почему почему Partial View является причиной этой проблемы? – Kate

+0

Это ответ для меня. .... я должен найти работу вокруг из-за отсутствия строк запроса. – JoshYates1980

+0

@ JoshYates1980, я с нетерпением ожидаю услышать от вас, как только вы найдете злую причину этой проблемы :) – usefulBee

1

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

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

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

0

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

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

xmlHttp = new XMLHttpRequest(); 

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

заботиться все ваши JS ошибки и предупреждающие сообщения.

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

+0

Получено то же предупреждение. Как ты это починил? – OrElse

0

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

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

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

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

1

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

+0

Я унаследовал страницу JSP, которая сделала то же самое. Я изменил кнопки с 'type =" submit "' на 'type =" button "' (и сохранил функции '.submit()' в JavaScript) и voila, только один вызов контроллера. Если бы я не видел этого, я бы все равно искал, почему я продолжал получать 'getOutputStream() уже вызван для исключений этого ответа'. – Capricorn1

0

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

2

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

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

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

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

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

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

+0

Я столкнулся с тем, где src был просто пустым, а не хешем: '' Тот же результат. Пытался «загрузить» изображение, в результате чего одно и то же действие контроллера вызывается дважды. – Manfred

0

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

Смежные вопросы