2010-05-01 111 views
27

Tengo un controlador que está siendo llamado dos veces desde una llamada de ActionLink.Se está llamando al controlador MVC dos veces

Mi página de inicio tiene un enlace, que cuando se hace clic llama al método Index en el controlador Play. Se pasa una identificación de 100 al método. Creo que esto es lo que está causando el problema. Más sobre esto a continuación.

Éstos son algunos fragmentos de código:

Principal:

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

Juego de control:

public ActionResult Index(int? id) 
{ 
     var settings = new Dictionary<string, string>(); 

     settings.Add("Id", id.ToString()); 

     ViewData["InitParams"] = settings.ToInitParams(); 

     return View(); 
} 

juegue Ver:

<%@ 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> 

Si me deshago de la parámetro para el Index me thod, todo está bien. Si dejo el parámetro en su lugar, se llama al método Index con 100 como id. Después de devolver la Vista, el método se llama por segunda vez con un parámetro de nulo.

Parece que no puedo averiguar qué está desencadenando la segunda llamada.

Mi primer pensamiento fue para agregar una ruta específica de esta manera:

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

Esto tuvo otro efecto que hacer un enlace mirando más bonita.

No estoy seguro de dónde ir desde aquí.

Gracias de antemano.

Rick

+0

¿Puedes registrar Firebug si la URL se solicita dos veces? –

Respuesta

58

¿Hay algún otro marcado que podría estar haciendo referencia accidentalmente a la página? Las referencias de scripts, referencias de imágenes, referencias de css, todas podrían señalarse erróneamente como '.' o la página actual.

+0

este es probablemente el culpable. –

+2

Resultó que un error de javascript "no se pudo encontrar el archivo" causaba que la página se cargara dos veces. ¡Gracias! – rboarman

+31

Tuve el mismo problema. En mi caso, era una etiqueta con src = "", por lo que podría cargar una imagen dinámicamente más tarde. Hizo un gran esfuerzo para rastrear ese. La solución fue eliminar por completo el atributo src. –

1

intente cambiar el int? id-int id. Está igualando la ruta la segunda vez porque estás llamando al índice nuevamente con una identificación nula.

1

También puede intentar cambiar su ruta a esto.

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

Puede recorrer el código en su vista. Paso a paso y ver de dónde viene la segunda llamada.

+1

Esto funcionó para mí después de un momento de confusión #headscratch. Resulta que estaba redireccionando un formulario de inicio de sesión, y en ese redireccionamiento, estaba configurando una nueva vista, con el mismo diseño de nuevo, forzándolo a generar dos veces. Busque MasterName y vea dónde puede estar forzando el nombre del diseño. – ScottCate

2

Durante la depuración descubrí que una vista parcial causa que se llame al controlador por segunda vez. Apesta, pero no veo un trabajo alrededor de eso.

+0

Tengo el mismo problema. ¿Por qué Parcial View es el caso de ese problema? – Kate

+0

Esta es la respuesta para mí. .... debo encontrar un trabajo sin cadenas de consulta. – JoshYates1980

+0

@ JoshYates1980, espero saber de usted una vez que encuentre la causa malvada de este problema :) – usefulBee

1

debería haber un marketing html que no funciona correctamente. por favor revise todo el img tage. También puedes ver

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

también estaba enfrentando el mismo problema. después de revisar minuciosamente mi proyecto, no encontré ninguno de esos casos de referencia vacíos. Luego descubrí que es causado por FireBug. Desactivar firebug o usar otro navegador que no tiene Firebug instalado resolvió el problema.

0

Tuve este mismo problema y verifiqué todas las sugerencias posibles, pero no tuve suerte, entonces noté que seguía el mensaje de advertencia de JS en mi consola.

sincrónica XMLHttpRequest en el hilo principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final. Para obtener más ayuda, marque https://xhr.spec.whatwg.org/.

xmlHttp = new XMLHttpRequest(); 

me corrigió esto y que funciona para mí.

Cuida todos sus js errores y mensajes de advertencia.

Esto puede ayudar a alguien.

+0

Tengo el mismo mensaje de advertencia. ¿Cómo lo arreglaste? – OrElse

0

Mi problema se resolvió asegurándome de que no estaba haciendo doble referencia a mis archivos JavaScript, que era yo.

Esto provocaba que la acción se tocara dos veces cuando hacía clic en el vínculo.

Sé lo anterior, pero pensé que señalaría que vale la pena verificar para ver si sus archivos se cargan dos veces, especialmente si está usando Partial Views.

Me di cuenta de que en uno de mis Partial Views le decía que utilizara la página de diseño principal que contenía las secuencias de comandos que eran responsables de lo que sucedió cuando hice clic en los enlaces. Así que arreglé esto simplemente configurando layout = null; ya que es una vista parcial de todos modos y ya se está cargando dentro del diseño principal.

1

Algo muy estúpido que hice ... tenía 2 formularios en una página con un botón en cada formulario. Agregué el script para enviar un formulario específico basado en el botón que se hizo clic pero, como la acción predeterminada de un botón en un formulario es hacer un envío, llamó a mi Acción del controlador dos veces. :^(

+0

Heredé una página JSP que hizo lo mismo. Cambié los botones de 'type =" submit "' a 'type =" button "' (y mantuve las funciones '.submit()' en el JavaScript) y voila, solo una sola llamada al controlador. Si no hubiera visto esto, todavía estaría buscando por qué seguí recibiendo 'getOutputStream() ya se ha llamado para esta respuesta' excepciones. – Capricorn1

0

En mi caso, yo estaba usando una vista parcial (así que no hay etiquetas de formulario) y el uso de un controlador on clic en jQuery para llamar a un método en el controlador a través de Ajax Pero había declarado el botón. el manejador estaba adjunto como tipo Enviar. Olvidé pasar e a mi función de manejador para llamar a e.PreventDefault() !! Así que el método del Controlador se llamaba dos veces: una desde una llamada ajax y una vez para Enviar. La segunda vez los parámetros fueron nulos. Esto me causó tanto dolor. Algo tan pequeño. Tan pequeño que fue fácilmente pasado por alto. Espero que esto ayude a alguien más.

2

10 horas persiguiendo ese error en un proyecto de Java Spring Maven.

Primero en SELECT Pensé que Hibernate solo estaba iniciando sesión dos veces, pero luego con INSERT pensé que las solicitudes se llamaban dos veces. Stepping throught el código descubrí controlador se llama dos veces ...

intentado todas las posibles configuraciones de primavera, pensando que el contexto se cargó dos veces o un grano fue instantiate dos veces ...

En la desesperación, rebuilded la pieza proyecto pieza para finalmente agregar un fragmento de HTML y bug de kaboom.

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

El signo agudo era culpable, volviendo a cargar la URL. Sé que el tema es antiguo, pero resumí mis búsquedas con las palabras que solía buscar en vano en Internet para encontrar una respuesta al mismo problema. Podría ayudar a otros ...

+0

Me encontré con lo mismo con src simplemente estaba vacío en lugar del hash: '' Mismo resultado. Intenté "cargar" la imagen, lo que resultó en la misma acción del controlador para que se llame dos veces. – Manfred

0

En mi caso, se configuró incorrectamente la secuencia de comandos remota Yandex.metrika (analítica de Google Analytics). Este script se presentó en cada página, por lo que cualquier controlador y cualquier acción se llamó dos veces. Verifique su configuración de Ya.metrika para más detalles.

Cuestiones relacionadas