2009-06-16 7 views
1

J'ai un UserControl que je veux inclure dans une page plusieurs fois par programme en fonction de certaines règles métier. Actuellement, le contrôle a une fonction JavaScript qui doit être appelée sur l'événement ASP.NET AJAX pageLoad.ASP.NET AJAX et UserControls: gestion des scripts côté client

J'utilise un modèle où la page principale a une fonction pageLoad qui appelle une fonction contentPageLoad sur n'importe quel ContentTemplate, si la fonction existe. Le ContentTemplate qui contient le UserControl en question serait alors responsable de l'appel de la fonction appropriée sur UserControl pendant cet événement.

Pour l'instant, le JavaScript est en ligne dans le .ascx pour le UserControl, mais j'ai le sentiment que je vais devoir utiliser la propriété Page.ClientScript pour l'injecter via le code derrière. Ma question est: comment est-ce que je m'assure que mes noms de fonction ne sont pas obnubilés, et m'assure que la méthode appropriée est appelée chaque UserControl?

FYI: le code qui doit être exécuté pour chaque UserControl est un bloc de jQuery qui crée un contrôle Multi-Select à partir d'un code HTML standard <select>.

EDIT:RegisterStartupScript a été suggéré, mais cela s'exécute avant que le chargement du DOM soit terminé. Envelopper la fonction dans un fichier jQuery Document.ready() ne semble pas utile. Le contrôle utilisateur s'exécute à l'intérieur d'un UpdatePanel, donc je n'ai pas vraiment le choix sur la façon d'appeler ce script.

Répondre

2

J'ai donc fini par adopter une approche hybride de ce que suggérait @DDaviesBrackett. J'enregistre une fonction avec Page.ClientScript, pas comme un script de démarrage, mais comme un ClientScriptBlock. La fonction utilise des classes au lieu d'ID (et donc, ClientID s) pour attacher à chaque contrôle. La structure de base est:

if(!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(),"scriptkey")) 
{ 
    Page.ClientScript.RegisterClientScriptBlock(
     Page.GetType(),"scriptkey",script,true); 
} 

avec le script suivant:

function bindMultiSelects() { 
    $('.multiselectclass').multiSelect({ 
     oneOrMoreSelected: '*', 
     noneSelected: 'Select Item(s)' 
    }); 
} 

(en utilisant le jQuery MultiSelect plugin impressionnant)

Encore une fois, cela fonctionne parce que ma page principale crée une méthode page_load qui appelle alors une méthode sur le contenu, qui appelle ensuite bindMultiSelects. Pour ma propre référence, les page_load et contentPageLoad fonctions à la fois suivent ce modèle « plug-in » J'ai trouvé here:

if(typeof functionname=='function') { 
    functionname() 
} 
2

Une solution consiste à utiliser le ClientID du contrôle de l'utilisateur dans la définition de la fonction JS:

function onLoadInitialize_<%=ClientID%>(){/*do things*/} 

puis utilisez Page.ClientScript.RegisterStartupScript pour l'amener à se produire pendant le client onLoad. Sachez que page_load happens on every asynchronous postback; Si vous voulez que les choses ne se produisent qu'une seule fois par chargement de page réel (à l'exception des publications asynchrones), utilisez plutôt l'événement init.

+0

Ce fut mon premier instinct, mais 'ClientId' n'existe pas dans le contexte de la UserControl. Aurais-je besoin d'hériter d'une certaine classe ou interface? – technomalogical

+0

Oups, avait une faute de frappe (ClientID devrait avoir un D majuscule) mais je ne sais toujours pas comment gérer l'appel de chacune de ces fonctions sur le chargement de la page AJAX (à ma connaissance, le client onLoad n'arrivera que sur la première page charge. – technomalogical

+0

mise à jour réponse - page_load se produira réellement sur chaque publication asynchrone, ce que je pense est ce que vous voulez. –

Questions connexes