ASP.Net Server Control - Enregistrement d'un fichier javaScript [Résolu]

Signaler
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
-
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

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
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
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
17
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
---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
17
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
---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
17
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
---------------------