Comment ajouter automatiquement un titre dans des pages aspx 2.0, en tenant compte des informations dans le sitemap.config

 

Il faut dire que ce n'est vraiment pas pratique de mettre un titre cohérent pour chaque page d'un site avec asp.net 2.0, le pb vient du fait que si l'on ajoute une page avec visual studio 2005 , celui-ci ajoute automatiquement un attribut title="undefined", donc souvent on le vois pas et niveau referencement c'est la catastrophe.

Pour eviter definitivement ce problème j'ai ecrit un petit module qui permet d'intercepter la requete et d'injecter a la volée soit le titre indiqué dans le fichier sitemap.config, ou la description.

Comment proceder ?

Premièrement il faut ecrire un module

 

public class TitleFromSiteMapModule : System.Web.IHttpModule

IHttpModule implique l'implementation de 2 methodes


Init() et Dispose()


Dans notre cas Init() nous interesse , il faut intervenir au moment ou le handler de page a été crée, ce qui veut dire que l'objet Page à été instancié. Pour se faire, il faut s'abonner a l'evenement "PreRequestHandlerExecute"


ce qui donne :



.


   public void Init(HttpApplication context)
   {
      context.PreRequestHandlerExecute += new EventHandler(context_PreSendRequestContent);
   }

maintenant dans la Methode "context_PreSendRequestContent" , il faut recuperer le handler, le caster en objet Page et s'abonner a l'evenement "Load" de la page , attention il est très imporant de limiter le traitement uniquement aux page aspx, donc il faut verifier que l'extension de fichier se termine bien par .aspx, sinon le module sera actif pour toutes les extensions mappées par IIS et peu devenir vraiment très pénalisant dans le cas d'un catch all.



.


   void context_PreSendRequestContent(object sender, EventArgs e)
   {
      HttpApplication app = (HttpApplication)sender;
      HttpContext ctx = app.Context;
 
      if (!ctx.Request.Url.LocalPath.EndsWith(".aspx"))
      {
         return;
      }
 
      System.Web.UI.Page page = ctx.Handler as System.Web.UI.Page;
 
      if (page != null)
      {
         page.Load += new EventHandler(Page_Load);
      }
   }


Il ne reste plus maintenant qu'a ajouter le titre contenu dans le ficher sitemap.config dans la method Page_Load :


.


   void Page_Load(object sender, EventArgs e)
   {
      Page currentPage = sender as Page;
      if (currentPage != null)
      {
         if (SiteMap.CurrentNode != null)
         {
            string title = SiteMap.CurrentNode.Description;
            if (String.IsNullOrEmpty(title))
            {
               title = SiteMap.CurrentNode.Title;
            }
            currentPage.Title = title;
         }
      }
   }

et voila , maintenant les informations contenues dans le fichier sitemap.config apparaissent dans le titre des pages automatiquement.

 



Aucun commentaire: