2010-02-03 21 views
21

Estoy intentando que los eventos de JQuery funcionen con vistas parciales en ASP.NET MVC. Sin embargo, después de cargar una vista parcial a través de Ajax, JQuery parece no poder disparar eventos para ninguno de los elementos en la vista parcial. Sospecho que este problema también ocurrirá si está utilizando otros marcos o bibliotecas de JavaScript para cargar código html parcial con Ajax.Los eventos de JQuery no funcionan con ASP.NET MVC Vistas parciales

Por ejemplo, consideremos el siguiente ejemplo:

controlador:

public class TestController : Controller 
    { 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult LoadPartialView() 
    { 
     return View("PartialView"); 
    } 
} 

Index.aspx

 <script type="text/javascript"> 
     $(document).ready(function() { 
      $("#button").click(function() { 
       alert('button clicked'); 
      }); 
     }); 
    </script>  

    <div> 
    <%using(Ajax.BeginForm("LoadPartialView", new AjaxOptions { UpdateTargetId="PartialView"})){ %> 
     Click <input type="submit" value="here" /> to load partial view. 
    <% } %> 
    </div> 
    <br /><br /> 
    <% Html.RenderPartial("PartialView"); %> 

PartialView.ascx

<div id="PartialView"> 
    Click <input type="button" id="button" value="here"></input> to display a javascript message. 
</div> 

Una vez se carga la página para th La primera vez, puede hacer clic en "Haga clic aquí para ver un mensaje de Javascript" y obtendrá un mensaje de alerta de Javascript que dice "botón presionado". Sin embargo, una vez que haga clic en "Haga clic aquí para cargar la vista parcial", hacer clic en el botón que se supone que trae el mensaje de alerta de Javascript no tiene ningún efecto. Parece que el evento 'clic' ya no se está disparando.

¿Alguien sabe por qué ocurre este problema con JQuery y cómo solucionarlo? Este problema también ocurre con otros complementos de JQuery que usan eventos.

Respuesta

9

La forma más fácil de manejar esto sería utilizar el método directo():

<script type="text/javascript"> 
     $(document).ready(function() { 
      $("#button").live('click', function() { 
       alert('button clicked'); 
      }); 
     });  
</script> 
+1

Impresionante. Esto de hecho funciona De acuerdo con la documentación oficial, live() se puede utilizar para adjuntar un controlador al evento para todos los elementos que coinciden con el selector actual, ahora o en el futuro. El único inconveniente es que las otras personas que escribieron los complementos aparentemente no usaron el método directo. Por lo tanto, para que funcione con los complementos existentes, es probable que alguien tenga que cavar en el código fuente y modificarlo. – dritan

+0

Es cierto. Eso o después de que el contenido se haya agregado a la página, puede volver a llamar al complemento en lugar de solo cargar la página. Si la respuesta es suficiente, márquela como aceptada ... – mkedobbs

+2

Esta respuesta no está actualizada, consulte la respuesta de PEOudin. – Martin

0

Lo que también funciona para mí es poner las cosas jQuery en la vista parcial. Solo asegúrese de que solo se haga referencia a los controles en la vista cargada, de lo contrario, puede obtener un controlador registrado dos veces para un control.

PartialView.ascx:

<div id="PartialView"> 
    Click <input type="button" id="button" value="here"></input> to display a javascript message. 
</div> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#PartialView").find("#button").click(function() { 
      alert('button clicked'); 
     }); 
    }); 
</script> 
39

He encontrado una solución:

Juste tratar de hacer:

$(document).on("click", "YOUR_SELECTOR", function(e){ 
    /// Do some stuff ... 
}); 

En lugar de:

$("YOUR_SELECTOR").on("click", function(e){ 
    /// Do some stuff ... 
}); 
+0

¡Gracias! Esto funcionó para mí y es una solución muy simple. Sin embargo, no estoy lo suficientemente informado como para conocer los pros y los contras entre esto y el método .live(). – Trunker

+0

@Trunker .live() está obsoleto "A partir de jQuery 1.7, el método .live() está en desuso. Use .on() para adjuntar controladores de eventos. Los usuarios de versiones anteriores de jQuery deben usar .delegate() con preferencia a. vivir()." –

+0

@PEOudin gracias por su respuesta, ¡funcionó para mí! Extrañamente, este problema solo ocurrió en MVC 5 (después de refactorizar una aplicación MVC 3 a MVC 5). Para MVC 3, la versión "$ (" YOUR_SELECTOR "). (..." funcionó sin ningún problema. ¿Alguien tiene una explicación para eso? –

1
<script> 
    $(document).ready(function(){ 
     $("input[id^=button]").live('click', function() { 
       //Your Code  

    }); 
}); 
</script> 
0

Ninguno de estos solución que funcionó para mí, por lo que tenía que hacer estas cosas para trabajar:

  1. creé una vista parcial y poner todas mis referencias de JavaScript en ese archivo
  2. he creado un div como esto
<div id="js"> 
     @Html.Partial("[Your_Path]") 
</div> 

3. Cuando me carga alguna parte de la página después de que hago esto en JavaScript:

$('#js').load('/Your_Controller/Your_Partial_function'); 
Cuestiones relacionadas