2010-02-03 20 views
21

Sto cercando di ottenere eventi JQuery per lavorare con viste parziali in ASP.NET MVC. Tuttavia, dopo aver caricato una vista parziale tramite Ajax, JQuery sembra non essere in grado di generare eventi per nessuno degli elementi nella vista parziale. Sospetto che questo problema si verificherà anche se utilizzi altri framework o librerie JavaScript per caricare codice html parziale con Ajax.Gli eventi JQuery non funzionano con ASP.NET MVC Visualizzazioni parziali

Ad esempio, si consideri il seguente esempio:

Controller:

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 volta che la pagina viene caricata per esimo La prima volta, puoi fare clic su "Fai clic qui per visualizzare un messaggio Javascript" e riceverai un messaggio di avviso Javascript che dice "pulsante cliccato". Tuttavia, dopo aver fatto clic su "Fai clic qui per caricare la vista parziale", facendo clic sul pulsante che dovrebbe portare il messaggio di avviso Javascript non ha alcun effetto. Sembra che l'evento "click" non venga più attivato.

Qualcuno sa perché questo problema si verifica con JQuery e come risolvere? Questo problema si verifica anche con altri plugin JQuery che utilizzano eventi.

risposta

9

Il modo più semplice per gestire questo sarebbe quello di utilizzare il metodo dal vivo():

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

Fantastico. Questo funziona davvero. Secondo la documentazione ufficiale live() può essere utilizzato per collegare un gestore all'evento per tutti gli elementi che corrispondono al selettore corrente, ora o in futuro. L'unico inconveniente è che le altre persone che hanno scritto i plug-in non hanno apparentemente utilizzato il metodo live. Quindi, per farlo funzionare con i plug-in esistenti, qualcuno probabilmente dovrebbe scavare nel codice sorgente e modificarlo. – dritan

+0

Vero. Questo o dopo che il contenuto è stato aggiunto alla pagina, è possibile richiamare il plug-in anziché solo al caricamento della pagina. Se la risposta è sufficiente, contrassegnarla come accettata ... – mkedobbs

+2

Questa risposta è obsoleta, vedere la risposta di PEOudin. – Martin

0

Ciò che funziona anche per me è quello di mettere la roba jquery nella vista parziale. Assicurati che solo i controlli nella vista caricata siano referenziati, altrimenti potresti ottenere un gestore registrato due volte per un controllo.

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

ho trovato una soluzione:

Juste provare a fare:

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

Invece di:

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

Grazie !!! Questo ha funzionato per me ed è una soluzione molto semplice. Tuttavia, non sono abbastanza esperto da sapere i pro e i contro tra questo e il metodo .live(). – Trunker

+0

@Trunker .live() è obsoleto "A partire da jQuery 1.7, il metodo .live() è deprecato. Usare .on() per collegare gestori di eventi. Gli utenti di versioni precedenti di jQuery dovrebbero usare .delegate() preferibilmente. vivere()." –

+0

@PEOudin grazie per la tua risposta, ha funzionato per me! Stranamente questo problema si è verificato solo in MVC 5 (dopo il refactoring di un'applicazione MVC 3 in MVC 5). Per MVC 3 il "$ (" YOUR_SELECTOR "). On (..." versione ha funzionato senza problemi Forse qualcuno ha una spiegazione per questo? –

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

    }); 
}); 
</script> 
0

Nessuna di queste soluzioni lavorato per me, quindi ho dovuto fare queste cose a lavorare:

  1. ho creato una vista parziale e mettere tutti i miei riferimenti JavaScript in quel file
  2. ho creato un div come questo
<div id="js"> 
     @Html.Partial("[Your_Path]") 
</div> 

3. Quando ho caricare qualche pagina parziale dopo che faccio questo in JavaScript:

$('#js').load('/Your_Controller/Your_Partial_function'); 
Problemi correlati