Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TITRE DE LA PAGE DYNAMIQUE EN DÉRIVANT LA CLASSE PAGE


Information sur la source

Catégorie :ASP.Net Source .NET ( DotNet ) Classé sous : title, dynamique, header, héritage, custompage Niveau : Initié Date de création : 31/05/2004 Date de mise à jour : 31/05/2004 12:22:23 Vu : 5 922

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


Description

Ce petit bout de code permet d'avoir dans le code dans la page me.Title = "...."

Pour arriver à ce résultat, j'ai dérivé la classe System.Web.UI.Page.J'avais déja publier une source qui permettait de faire ca, mais celle ci est beaucoup plus puissante :)

Le code par lui meme est relativement assez simple, quand on le regarde il n'y a rien d'extraordinaire, j'ai créer une classe BasePage, qui dérive de System.Web.UI.Page, j'ai surchargé la méthode Render, et c'est à peu pres tout :)

Je vais d'abord vous expliquer comment faire fonctionner ce code, puis je vous dirais comment je suis arrivé jusqu'a ce code.

Tout d'abord, pour utiliser le code ci dessous, vous devez l'inclure dans un fichier vb :p Ensuite il faut faire quelques mofication, au sein de la page aspx.vb.

d'origine celle ci est de la structure :

Public Class Contacts
    Inherits System.Web.UI.Page
...
end class

Nous on veut la fare dériver de BasePage qui elle meme dérive de System.Web.UI.Page la page ressemblera donc à ca :

Public Class Contacts
    Inherits BasePage
...
end class

Maintenant vous avez deux possibilité :
- soit en rester la (dans le cas notre code ne servirait à rien :p), le titre de la page affiché sera celui contenu dans le .aspx
- Soit se servir de mon code :) pour cela rien de plus simple dans le page_load de la page faites tout simplement
me.Title = "Le titre de la page"
   Dans ce cas, si vous avez un titre dans le .aspx il sera remplacé, mais libre à vous de modifier BasePage pour qu'il répondent à vos attentes

L'utilisation du code est donc tres simple. Mais la facon d'arriver à celui ci est loin d'etre simple

d'abord l'idée vient d'un message sur le net qui dit que c'etait possible de faire ca en asp.net 2.0, mais comme tout le monde le sait cette version n'existe pas, il me fallait donc une solution.
Tout de suite j'ai cherché à dériver System.Web.UI.Page, une fois fait j'ai regardé les differentes méthodes que j'aurais pu utiliser, et c'est la méthode Render qui me convenait le mieux.
d'habitude quand on utilise la méthode Render
dans la plupart des cas, on fait
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

        'Traitement du MyBase

        MyBase.RenderControl(writer)

   End Sub

J'ai essayé de trouvé tout ce que je pouvais dans le MyBase, mais rien de simple qui me permettait d'intercepter le rendu de la page, j'ai essayé de regarder ce que je pouvais faire dans le Me, rien de spécial non plus, mais un petit truc m'a attiré l'oeil, j'ai vu qd je debuggais avec VS.net que Me.Controls ne contenait que 3 controles, j'ai regardé dedans si par hasard il pouvait se trouver mon bonheur, et oui !!! j'ai vu en faisait des response.write a co que le premier controle contenait le Header le deuxieme je ne sais pas trop quoi (ce n'etais pas un LiteralControl donc il a pas aimé les response.write :p) et le dernier la fin de la page, de la j'en ai deduit que le 2eme contenait le corp de la page :).
Maintenant que j'avais trouvé tout ceci, restait à y mettre en forme autrement qu'avec des response.write :p. J'ai enlevé mon MyBase.Render(Writer) qui me servait plus à rien, et j'ai cherché à faire un rendu de ces 3 controles, mais le problème c'est que le render de LiteralControl est Protected, de là j'ai cherché des moyens pour contourner ce problème etc... je me suis apercu (bien trop tardivement) que le RenderControl n'etait pas Protected, je me demande toujours la difference entre le RenderControl, et le Render et pourkoi l'un est protected l'autre pas, mais tout ce que j'ai constaté c'est que ca marche !!!!
J'ai remis en forme tout ca essayé de faire un code assez propre et c'etait finit :)

Je vous ai montré l'exemple pour mettre le Title, il est simple maintenant de faire de meme avec les autres balises meta ... et on pourrait meme allé plus loin en encadrant le viewstate de <div style="display:none"></div> pour le rendre XHTML Compliant, comme c'est déja le cas dans asp.net 2.0 ....

Je ferais surement un jour ces quelques ajouts, mais si vous en faites aussi, n'hésitez pas à me les donner :)

UPDATES :
- 31 mai 04 :
    - suppression d'un "<" qui trainait à la fin de cHeader
    - ajout de la possibilité d'avoir un titre sans qu'il y ai la balise <title> dans le .aspx
    - ajout de la propriété AddTitle qui permet de spécifier comment l'on doit rajouter le titre, tres simple à comprendre
                   Exemple :  Me.AddTitle = BasePage.AddTitleMode.AddAfter




 

Source

  • Public Class BasePage
  • Inherits System.Web.UI.Page
  • Public Enum AddTitleMode As Byte
  • ReplaceMode = 1
  • AddBefore = 2
  • AddAfter = 3
  • End Enum
  • #Region " Propriété "
  • Private _Title As String
  • Public Property Title() As String
  • Get
  • Return _Title.ToString
  • End Get
  • Set(ByVal Value As String)
  • _Title = Value
  • End Set
  • End Property
  • Private _AddTitle As AddTitleMode = AddTitleMode.ReplaceMode
  • Public Property AddTitle() As AddTitleMode
  • Get
  • Return _AddTitle
  • End Get
  • Set(ByVal Value As AddTitleMode)
  • _AddTitle = Value
  • End Set
  • End Property
  • #End Region
  • Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
  • Dim isFoundTitle As Boolean = False
  • 'simple compteur
  • Dim i As Integer = 0
  • For Each cControl As Control In Me.Controls()
  • ''' seul le premier control contient ce qu'il nous interesse
  • ''' je fais le necessaire seulement si la propriété Title
  • ''' n'est pas vide, ainsi elle gardera sa valeur mis dans la page aspx
  • If Not Title = "" And i = 0 Then
  • ''' Pour l'instant dans tous les cas que j'ai rencontré
  • ''' Le premier control etait un literal control qui
  • ''' Contenait tout le heade de la page
  • Dim cHeader As LiteralControl = CType(cControl, LiteralControl)
  • ''' Je le decoupe pour ajouter ce que je veux
  • Dim Header() As String = cHeader.Text.Split("<")
  • ''' on vide le titre qu'il contient déja mais c'est mon choix
  • ''' C'est assez simple de le rajouter derriere ou devant a vous de voir
  • cHeader.Text = ""
  • ''' Je fais une boucle sur tous et scute celui qui commence par
  • ''' title, j'ai rajouté ToLower car dans la page il y a de multiple
  • ''' facon de l'ecrire
  • ''' si celui ci est trouvé, j'ajout le titre
  • ''' dans tout les cas je rajoute le bout du header au controle
  • For Each s As String In Header
  • If s.ToLower.StartsWith("title") Then
  • Select Case _AddTitle
  • Case AddTitleMode.ReplaceMode
  • s = "Title>" & _Title
  • Case AddTitleMode.AddBefore
  • s = s.Insert(6, _Title)
  • Case AddTitleMode.AddAfter
  • s = s.Insert(s.Length, _Title)
  • End Select
  • isFoundTitle = True
  • End If
  • cHeader.Text &= s & "<"
  • Next
  • '''Il reste le dernier "<" qui traine
  • cHeader.Text = cHeader.Text.Remove(cHeader.Text.Length - 1, 1)
  • ''' On rajoute le titre juste apres le head au cas où il n'y aurait pas de balise title dans le .apsx
  • If Not isFoundTitle Then cHeader.Text = cHeader.Text.Insert(cHeader.Text.ToLower.IndexOf("<head>") + 6, vbNewLine & "<Title>" & _Title & "</Title>")
  • ''' Une fois tout ca fait, j'envoie cette partie
  • cHeader.RenderControl(writer)
  • Else
  • ''' il existe d'autre partie, que je renvoie aussi
  • ''' je pense que dans la plupart des cas, c'est constitué de la manière suivante :
  • ''' - Me.controls(0) contient le Header de la page du debut de la page jusqu'au <body>
  • ''' - Me.controls(1) contient la balise form donc de <form> jusqu'a </form>
  • ''' - Me.controls(2) contient la fermeture de la page du </body> jusqu'au </html>
  • '''
  • ''' puisqu'on peut avoir plusieurs form dans une seule page, il peut y avoir plus
  • ''' que 3 controls dans la pages
  • cControl.RenderControl(writer)
  • End If
  • i += 1
  • Next
  • End Sub
  • End Class
Public Class BasePage
    Inherits System.Web.UI.Page

    Public Enum AddTitleMode As Byte
        ReplaceMode = 1
        AddBefore = 2
        AddAfter = 3
    End Enum

#Region " Propriété "

    Private _Title As String
    Public Property Title() As String
        Get
            Return _Title.ToString
        End Get
        Set(ByVal Value As String)
            _Title = Value
        End Set
    End Property

    Private _AddTitle As AddTitleMode = AddTitleMode.ReplaceMode
    Public Property AddTitle() As AddTitleMode
        Get
            Return _AddTitle
        End Get
        Set(ByVal Value As AddTitleMode)
            _AddTitle = Value
        End Set
    End Property
#End Region

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

        Dim isFoundTitle As Boolean = False
        'simple compteur
        Dim i As Integer = 0
        For Each cControl As Control In Me.Controls()

            ''' seul le premier control contient ce qu'il nous interesse
            ''' je fais le necessaire seulement si la propriété Title
            ''' n'est pas vide, ainsi elle gardera sa valeur mis dans la page aspx
            If Not Title = "" And i = 0 Then

                ''' Pour l'instant dans tous les cas que j'ai rencontré 
                ''' Le premier control etait un literal control qui 
                ''' Contenait tout le heade de la page
                Dim cHeader As LiteralControl = CType(cControl, LiteralControl)

                ''' Je le decoupe pour ajouter ce que je veux
                Dim Header() As String = cHeader.Text.Split("<")

                ''' on vide le titre qu'il contient déja mais c'est mon choix
                ''' C'est assez simple de le rajouter derriere ou devant a vous de voir
                cHeader.Text = ""

                ''' Je fais une boucle sur tous et scute celui qui commence par
                ''' title, j'ai rajouté ToLower car dans la page il y a de multiple
                ''' facon de l'ecrire
                ''' si celui ci est trouvé, j'ajout le titre 
                ''' dans tout les cas je rajoute le bout du header au controle
                For Each s As String In Header
                    If s.ToLower.StartsWith("title") Then
                        Select Case _AddTitle
                            Case AddTitleMode.ReplaceMode
                                s = "Title>" & _Title
                            Case AddTitleMode.AddBefore
                                s = s.Insert(6, _Title)
                            Case AddTitleMode.AddAfter
                                s = s.Insert(s.Length, _Title)
                        End Select
                        isFoundTitle = True
                    End If
                    cHeader.Text &= s & "<"
                Next

                '''Il reste le dernier "<" qui traine 
                cHeader.Text = cHeader.Text.Remove(cHeader.Text.Length - 1, 1)

                ''' On rajoute le titre juste apres le head au cas où il n'y aurait pas de balise title dans le .apsx
                If Not isFoundTitle Then cHeader.Text = cHeader.Text.Insert(cHeader.Text.ToLower.IndexOf("<head>") + 6, vbNewLine & "<Title>" & _Title & "</Title>")


                ''' Une fois tout ca fait, j'envoie cette partie 
                cHeader.RenderControl(writer)
            Else
                ''' il existe d'autre partie, que je renvoie aussi 
                ''' je pense que dans la plupart des cas, c'est constitué de la manière suivante :
                ''' - Me.controls(0) contient le Header de la page du debut de la page jusqu'au <body>
                ''' - Me.controls(1) contient la balise form donc de <form> jusqu'a </form>
                ''' - Me.controls(2) contient la fermeture de la page du </body> jusqu'au </html>
                ''' 
                ''' puisqu'on peut avoir plusieurs form dans une seule page, il peut y avoir plus 
                ''' que 3 controls dans la pages
                cControl.RenderControl(writer)
            End If

            i += 1
        Next

    End Sub

End Class

Conclusion

Les commentaires sont toujours les bienvenus :)

Je rajouterais des trucs de temps en temps

 

Commentaires et avis

signaler à un administrateur
Commentaire de RayBan le 01/06/2004 09:30:02

Tu pourrais en temps en utilisant des expressions régulière pour rechercher le texte et le remplacer :

Pour rechercher le tage "Title" :
&lt;(?&lt;title&gt;\w*)&gt;(?&lt;text&gt;.*)&lt;/\k&lt;title&gt;&gt;

Pour remplacer le texte par le titre voulu :
&lt;${1}&gt;MonTexte&lt;/${1}&gt;

Avec cela tu as beaucoup moins de traitement de chaîne...

Ray

signaler à un administrateur
Commentaire de jesusonline le 01/06/2004 20:47:05 administrateur CS

Ta méthode m'a l'air pas mal, mais il y a quelques problèmes, si on on a :
&lt;title &gt;Texte&lt;/title&gt;, cela me retourne False, mais je pense que c'est juste un problème au niveau de l'expression reguliere, mais je connais malheureusement que tres peu les Regexp.

Sinon j'ai pas compris comment tu fais pour remplacer ?

signaler à un administrateur
Commentaire de RayBan le 04/06/2004 15:44:51

Il y a beaucoup plus simple pour changer dynamiquement le tite de la page... Tu créer une function comme celle là dans la partie code VB du webform :

Public Function WriteTitle() As String
        Return "MyTitle"
End Function

Et tu l'appelle directement depuis le contenu HTML du webform comme ci-dessous :

...
&lt;HEAD&gt;
&lt;title&gt;&lt;%=WriteTitle()%&gt;&lt;/title&gt;
&lt;/HEAD
...

Et hop... ça le fait....

Ray

signaler à un administrateur
Commentaire de RayBan le 04/06/2004 15:45:00

Il y a beaucoup plus simple pour changer dynamiquement le tite de la page... Tu créer une function comme celle là dans la partie code VB du webform :

Public Function WriteTitle() As String
        Return "MyTitle"
End Function

Et tu l'appelle directement depuis le contenu HTML du webform comme ci-dessous :

...
&lt;HEAD&gt;
&lt;title&gt;&lt;%=WriteTitle()%&gt;&lt;/title&gt;
&lt;/HEAD
...

Et hop... ça le fait....

Ray

signaler à un administrateur
Commentaire de jesusonline le 04/06/2004 17:11:55 administrateur CS

Je sais que ca le fait mais ta solution est une astuce et j'aime pas le bricolage ...

J'avais deja mis une autre astuce en faisait un
&lt;title id="title" runat="server&gt; voir http://www.aspfr.com/code.aspx?ID=22371

Ma solution est je trouve beaucoup plus clean, mais apres c'est à toi de voir ce que tu veux faire, si tu veux continuer la bidouille ou faire une programmation propre

signaler à un administrateur
Commentaire de DONALDMI le 22/06/2004 19:39:54

On peut trouver  plus simple pour changer dynamiquement le tite de la page... Tu créer une function dans la partie code VB du webform :

Public Function WriteTitle() As String
        Return "MyTitle"
End Function

signaler à un administrateur
Commentaire de jesusonline le 22/06/2004 19:58:55 administrateur CS

Je ne vois pas vraiment ou veut tu en venir, mais je pense que ta solution est tres semblable a l'astuce de Rayban donc meme reponse ...

signaler à un administrateur
Commentaire de killergege2 le 08/09/2004 11:29:30

Encore beaucoup plus simple !!!!!!
Je crois que tu t'es un peu cassé la tête pour rien (enfin, d'après ce que j'ai compris, ca fait la même chose)

Il suffit de définir le tag title comme un tag traité par le serveur :

Dans le .ASPX
<title id="mytitle" runat="server" />

Dans le ASPX.VB
Déclaration du tag en global:
Protected mytitle As HtmlGenericControl

Modification du texte :
mytitle.InnerText = "Mon titre"

Il est ainsi possible de travailler avec n'importe quel tag HTML et modifier tout les attributs et parametres (notamment peut être très utile avec les inputs).

Autre exemple avec un meta tag (description):
<meta name="description" runat="server" id="mydescription" />

Protected mydescription As HtmlGenericControl


mydescription.Attributes.Add("content", "description du site")

signaler à un administrateur
Commentaire de jesusonline le 08/09/2004 17:22:40 administrateur CS

je sais qu'il y a plus simple, mais dans ton cas, si tu as VS.net, il va te supprimer le runat=server à chaque fois que tu vas aller dans le mode design, donc tu vas avoir des erreurrs.

Sinon j'ia encore plus simple : attendre asp.net

et tout simplement ecrire me.Header.Title = " .... " c'est tout :D

Cyril

signaler à un administrateur
Commentaire de spaceclic le 20/04/2005 09:13:06

Il ne supprime pas la balise a chaque fois, si elle est bien formulé comme la dit killergege

<title id="titre" runat="server"/>

signaler à un administrateur
Commentaire de spaceclic le 20/04/2005 09:16:17

sachant que <title id="titre" runat="server"></title> fonctionne également

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

tableau dynamique en asp [ par amina ] Salut,Pour une transaction de vente, j'affiche une ligne concernant un article(idarticle,prix,quantité,prix_total), mais si le client veut acheter plu pb avec un select box et menu dynamique [ par franzioz ] Bonjour,J'ai un pb car j'ai un select box juste en dessous de mon menu dynamique deroulant et quand ce menu dessant il est en partie caché par le sele problem de dowload... [ par moy ] salut,je crée mon site en asp, mais je suis confronté à un probléme que je ne comprend pas..en fait mon pb, c'est dès que que clique sur un fichier as case à cocher : (héritage) [ par patrice ] Bonjour à tous,J'aimerai savoir comment peut t'on faire pour que lorsque l'on clique sur une case à cocher les autres case à cocher situées en dessous INCLUDE dynamique pour une image [ par Bud ] Je cherche à faire un INCLUDE d'une image, mais cela de façon dynamique. J'ai réussi à le faire pour un bout de textefunction incFile(fichier) dim site dynamique [ par mohamed ] j' ai développé un site mais d'une façon statique et je voudrais mentenant transformé notre site d'êter dynamiqueen utilisant ASP,PHP, Access,Mysql su


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,718 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.