2010-02-03 8 views
21

J'essaie de faire fonctionner les événements JQuery avec des vues partielles dans ASP.NET MVC. Toutefois, après avoir chargé une vue partielle via Ajax, JQuery ne semble pas pouvoir déclencher des événements pour l'un des éléments de la vue partielle. Je pense que ce problème se produira également si vous utilisez d'autres frameworks ou bibliothèques JavaScript pour charger du code html partiel avec Ajax.Les événements JQuery ne fonctionnent pas avec ASP.NET MVC Vues partielles

Par exemple, considérons l'exemple suivant:

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> 

Une fois que la page se charge pour th La première fois, vous pouvez cliquer sur "Cliquez ici pour afficher un message Javascript" et vous obtiendrez un message d'alerte Javascript qui dit "bouton cliqué". Cependant, une fois que vous avez cliqué sur "Cliquer ici pour charger la vue partielle", cliquer sur le bouton censé apporter le message d'alerte Javascript n'a aucun effet. Il semble que l'événement 'click' ne soit plus déclenché.

Est-ce que quelqu'un sait pourquoi ce problème se produit avec JQuery et comment résoudre ce problème? Ce problème se produit également avec d'autres plug-ins JQuery qui utilisent des événements.

Répondre

9

La meilleure façon de gérer ce serait d'utiliser la méthode en direct():

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

Génial. Cela fonctionne en effet. Selon la documentation officielle live() peut être utilisé pour attacher un gestionnaire à l'événement pour tous les éléments qui correspondent au sélecteur actuel, maintenant ou dans le futur. Le seul inconvénient est que les autres personnes qui ont écrit les plug-ins n'ont apparemment pas utilisé la méthode live. Par conséquent, pour le faire fonctionner avec des plug-ins existants, quelqu'un aurait probablement besoin de creuser dans le code source et de le modifier. – dritan

+0

True. Cela ou après que le contenu est ajouté à la page, vous pouvez appeler à nouveau le plugin au lieu de simplement charger la page. Si la réponse est suffisante, veuillez la marquer comme acceptée ... – mkedobbs

+2

Cette réponse est périmée, voir la réponse de PEOudin. – Martin

0

Ce qui fonctionne aussi pour moi est de mettre les choses jquery dans la vue partielle. Assurez-vous simplement que seuls les contrôles dans la vue chargée sont référencés, sinon vous pouvez obtenir un gestionnaire qui est enregistré deux fois pour un contrôle.

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

J'ai trouvé une solution:

essayer de faire Juste:

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

Au lieu de:

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

Merci! Cela a fonctionné pour moi et est une solution très simple. Cependant, je ne suis pas assez bien informé pour connaître les avantages et les inconvénients entre ceci et la méthode .live(). – Trunker

+0

@Trunker .live() est obsolète "À partir de jQuery 1.7, la méthode .live() est obsolète, utilisez .on() pour attacher des gestionnaires d'événements Les utilisateurs d'anciennes versions de jQuery devraient préférer .delegate(). vivre()." –

+0

@PEOudin merci pour votre réponse, cela a fonctionné pour moi! Bizarrement, ce problème ne s'est produit que dans MVC 5 (après avoir refactorisé une application MVC 3 en MVC 5). Pour MVC 3 le "$ (" YOUR_SELECTOR "). (..." version a fonctionné sans aucun problème.) Peut-être que quelqu'un a une explication à cela? –

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

    }); 
}); 
</script> 
0

Aucune de ces solutions a fonctionné pour moi, donc je devais faire ces choses à travailler:

  1. J'ai créé une vue partielle et mettre toutes mes références JavaScript dans ce fichier
  2. J'ai créé un div comme celui-ci
<div id="js"> 
     @Html.Partial("[Your_Path]") 
</div> 

3.Quand je charge une page partielle après que je fais en JavaScript:

$('#js').load('/Your_Controller/Your_Partial_function'); 
Questions connexes