2010-02-03 7 views
21

Ich versuche, JQuery-Ereignisse mit Teilansichten in ASP.NET MVC zu arbeiten. Nachdem Sie jedoch eine Teilansicht über Ajax geladen haben, kann JQuery keine Ereignisse für eines der Elemente in der Teilansicht auslösen. Ich vermute, dass dieses Problem auch auftritt, wenn Sie andere Frameworks oder JavaScript-Bibliotheken verwenden, um partiellen HTML-Code mit Ajax zu laden.JQuery-Ereignisse funktionieren nicht mit ASP.NET MVC Teilansichten

Betrachten wir zum Beispiel das folgende Beispiel:

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> 

Sobald die Seite geladen wird für th Wenn Sie das erste Mal auf "Klicken Sie hier, um eine Javascript-Nachricht anzuzeigen" klicken, erhalten Sie eine JavaScript-Warnmeldung mit der Meldung "Schaltfläche angeklickt". Sobald Sie jedoch auf "Klicken Sie hier, um Teilansicht zu laden" klicken, hat das Klicken auf die Schaltfläche, die die JavaScript-Warnmeldung bringen soll, keine Auswirkung. Es scheint, dass das Ereignis "click" nicht mehr ausgelöst wird.

Weiß jemand, warum dieses Problem mit JQuery auftritt und wie zu beheben? Dieses Problem tritt auch bei anderen JQuery-Plugins auf, die Ereignisse verwenden.

Antwort

9

Der einfachste Weg, dies zu handhaben zu nutzen wäre live() -Methode:

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

Ehrfürchtig. Das funktioniert tatsächlich. Gemäß der offiziellen Dokumentation kann live() verwendet werden, um einen Handler an das Ereignis für alle Elemente anzuhängen, die dem aktuellen Selektor jetzt oder in der Zukunft entsprechen. Der einzige Nachteil ist, dass die anderen Leute, die die Plug-Ins geschrieben haben, nicht offensichtlich die Live-Methode verwendet haben. Um also mit vorhandenen Plug-Ins arbeiten zu können, müsste jemand wahrscheinlich den Quellcode eingraben und optimieren. – dritan

+0

Wahr. Nachdem der Inhalt der Seite hinzugefügt wurde, können Sie das Plug-In erneut aufrufen, anstatt nur auf der Seite zu laden. Wenn die Antwort ausreichend ist, markieren Sie sie als akzeptiert ... – mkedobbs

+2

Diese Antwort ist veraltet, siehe Antwort von PEOudin. – Martin

0

Was auch für mich funktioniert, ist die jquery Sachen in der Teilansicht zu setzen. Stellen Sie nur sicher, dass nur die Steuerelemente in der geladenen Ansicht referenziert werden, andernfalls erhalten Sie möglicherweise einen Handler, der für ein Steuerelement zweimal registriert ist.

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

ich eine Lösung gefunden haben:

Juste versuchen zu machen:

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

Statt:

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

Danke !!! Das hat für mich funktioniert und ist eine sehr einfache Lösung. Ich bin jedoch nicht gut genug, um die Vor- und Nachteile zwischen dieser und der .live() -Methode zu kennen. – Trunker

+0

@Trunker .live() ist veraltet "Ab jQuery 1.7 ist die .live() -Methode veraltet. Verwenden Sie .on() zum Anhängen von Ereignishandlern. Benutzer älterer Versionen von jQuery sollten .delegate() verwenden. Leben()." –

+0

@PEOudin danke für deine Antwort, es hat für mich funktioniert! Seltsamerweise trat dieses Problem nur in MVC 5 auf (nach dem Refactoring einer MVC 3-Anwendung auf MVC 5). Für MVC 3 hat die "$ (" YOUR_SELECTOR "). On (..." Version funktioniert ohne Probleme. Vielleicht hat jemand eine Erklärung dafür? –

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

    }); 
}); 
</script> 
0

Keine dieser Lösung für mich gearbeitet, so hatte ich diese Dinge zu tun, um zu arbeiten:

  1. ich eine Teilansicht erstellt und alle meine JavaScript Referenzen in dieser Datei
  2. ich ein div wie diese
  3. setzen erstellt
<div id="js"> 
     @Html.Partial("[Your_Path]") 
</div> 

3.When laden ich einige Teil Seite nach, dass ich das in JavaScript:

$('#js').load('/Your_Controller/Your_Partial_function'); 
Verwandte Themen