ASP.Net Server Control - Enregistrement d'un fichier javaScript

Résolu
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 3 juil. 2009 à 10:47
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 8 juil. 2009 à 09:34
Bonjour,

Je m'en remet à vous pour m'aider à résoudre un petit problème.
Je développe actuellement une librairie de "Server Control" pour une appli Web.
Certains "Server Control" se verront dotés de propriétés (onblur, onclick,...) qui déclencheront une action javaScript.
Exemple:
public class CustomControl : WebControl
{
        public CustomControl()
            : base(HtmlTextWriterTag.Div)
        {
        }

        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);

            writer.AddAttribute("onblur", "javascript:foo();");
        }
}

Cependant, j'aimerais que le corps de ma méthode "foo()" appartienne à un fichier javascript (.js) [lui même inclus (content, ou embedded ressource) dans le projet de librairie des "servers controls"].
C'est pourquoi il faudrait que mon "CustomControl" enregistre automatiquement le fichier javascript afin que la page html contiennet le tag:
<script language="javascript" type="text/javascript" src="foo.js">
</script>

Et c'est là que je bloque et que je m'en remet à vous. Comment feriez-vous ?
Je sens que l'enregistrement du fichier ne sera pas possible car ce fichier ne se trouve pas sur le site Web (en même temps, ce n'est pas logique de séparer le control et son javascript associé [c'est pour cela que je préfère le laisser dans la librairie]).
J'ai donc pensé que l'on pourrait appelé un Page.ClientScript.RegisterClientScriptBlock qui injecterai le javascript de "foo.js" à la volée seulement je ne sais pas si j'aurai accès à la page lorsque le CustomControl fera son Render.

Qu'en pensez-vous ?

Merci par avance pour votre aide,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------

4 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 juil. 2009 à 00:44
Bonjour,

Tu peux utiliser la méthode Page.ClientScript.GetWebResourceUrl. J'explique son fonctionnement (ainsi que d'autres astuces) ici : http://blogs.developpeur.org/cyril/archive/2006/12/24/webresource-et-performsubstitution.aspx 

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
3
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
3 juil. 2009 à 11:09
Re,

En fait, je suis un peu bête. J'ai bien accès à ma page à partir de mon controle de la façon suivante:
this.Page.ClientScript.RegisterClientScriptBlock(...)

Je vais donc faire de cette façon pour l'instant mais je reste ouvert pour de nouvelles propositions.

Merci,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 juil. 2009 à 09:31
Merci pour la réponse !
Je vais regarder cela de suite.

Pour info: pour l'instant, j'ai mis en place une classe statique me permettant d'enregistrer un fichier javascript (en mode: embedded resource):
public static class ControlHelper
{
     /// <summary>
     /// Registers a javascript file for web page.
     /// </summary>
     /// The <see cref="System.Web.UI.Control"/> which registers the javascript file.

     /// The file path.

     public static void RegisterJavaScriptFile(Control control, string path)
     {
         string key = Path.GetFileNameWithoutExtension(path);

         if (control.Page.ClientScript.IsClientScriptBlockRegistered(control.Page.GetType(), key))
         {
             return;
         }

         StringBuilder javaScript = new StringBuilder();
         Assembly assembly = Assembly.GetExecutingAssembly();
         using (TextReader reader = new StreamReader(assembly.GetManifestResourceStream(path)))
         {
             try
             {
                 javaScript.AppendLine(reader.ReadToEnd());
             }
             finally
             {
                 reader.Close();
             }
         }

         control.Page.ClientScript.RegisterClientScriptBlock(control.Page.GetType(), key, javaScript.ToString(), true);
     }
}

Exemple d'utilisation:
ControlHelper.RegisterJavaScriptFile(this, "namespace.subdir.file.js");
//Lorsque je suis dans mon CustomControl (pour le this ^^).
//Le path du fichier js qui n'est pas tout à fait le path mais plutôt une chemin [je ne sais même pas comment on appelle ça].

Bonne journée,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
8 juil. 2009 à 09:34
Nickel ton post jesusonline !
J'étais pas très loin qd même
Ca va me servir à fond.

Bonne journée,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
0
Rejoignez-nous