2016-04-27 4 views
0

J'ai créé un contrôle serveur ASP.Net, appelons-le "WebGrid". Le contrôle WebGrid a une ressource javascript intégrée qu'il enregistre avec le ScriptManager de la page qui l'héberge.Enregistrer une ressource javascript sur un contrôle serveur ajouté dynamiquement

protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     ClientScriptManager scriptManager = this.Page.ClientScript; 
     scriptManager.RegisterClientScriptResource(typeof(WebGrid), "Atl.Core.Resources.Scripts.WebGrid.js"); 
    } 

J'ai aussi fait en sorte que le fichier WebGrid.js est une ressource intégrée en modifiant la propriété d'action de construction du fichier à « ressources embedded » et a ajouté la ressource aux AssemblyInfo.cs du projet en tant que tel :

[assembly: WebResource("Atl.Core.Resources.Scripts.WebGrid.js", "text/js")] 

maintenant, lorsque le contrôle est déclaré dans le balisage d'une page ASPX la ressource javascript est inscrit sur le ScriptManager et tout fonctionne bien. MAIS, si j'ajoute le contrôle à ControlCollection de la page dynamiquement par un clic de bouton, le javascript n'est pas enregistré et le contrôle se plaint ne peut pas trouver telle ou telle fonction javascript. Remarque à la fois sur le bouton et le WebGrid sont situés dans différentes UpdatePanels ...

EDIT: Il semble que le problème est parce que je suis en utilisant le ClientScript contre ScriptManager voir (Differences between ScriptManager and ClientScript when used to execute JS?). Alors, comment puis-je enregistrer le script de WebGrid avec ScriptManager de la page?

Répondre

0

Alors je l'ai compris. La réponse est plutôt simple. Dans le gestionnaire d'événements PreRender de contrôle, appelez simplement la méthode static RegisterClientScriptResource sur la classe ScriptManager. J'étais confus parce que je pensais que j'avais besoin de référencer le ScriptManager physique sur la page! Nan. Vous devez toujours définir le script en tant que ressource incorporée et ajouter l'attribut WebResource dans le fichier Assembly.cs.

protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     ScriptManager.RegisterClientScriptResource(this, typeof(ScriptTest), "Atl.Core.Resources.Scripts.ScriptTest.js"); 
    }