2010-10-22 13 views
1

J'utilise des formulaires Web ASP.NET, avec des pages maîtres. Je souhaite ajouter un attribut LANG à la balise <title>. ASP.NET génère automatiquement une balise de titre. Je l'ai essayé d'ajouter mon propre étiquette avec un ID et runat = « server », comme ceci:Comment ajouter un attribut à la balise de titre

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

Quand vous faites cela, je peux définir un attribut comme ce qui suit sans aucune erreur.

titleBlock.Attributes.Add("lang", "it"); 

Cependant, ASP.NET efface mon tag <title> complètement et met son propre sans ma attribut LANG. Y a-t-il un moyen d'accomplir cela? Merci beaucoup.

+0

Utilisez-vous des pages maîtres? Est-ce que la page principale/la page de contenu l'emporte sur cela? – Oded

+0

@Oded, oui j'utilise des masterpages (la première phrase de ma question le dit). La page de contenu définit le titre via Page.Title = "...". Le code que je montre dans ma question (où j'ai ajouté ma propre balise de titre) est fait directement dans le mastercode codebehind. –

Répondre

3

Cela se produit parce que le contrôle htmlTitle ne fournit pas un RenderAttributes mise en œuvre. Vous ne pouvez pas (facilement) sous-classer le contrôle dans ce cas mais il y a une autre option. La puissance de Les adaptateurs de contrôle ne sont pas limités à WebControls - le concept aussi extends à HtmlControls.

baisse ce qui suit dans un fichier * .browser sous les App_Browsers répertoire de votre site:

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 
     <adapter 
     controlType="System.Web.UI.HtmlControls.HtmlTitle" 
     adapterType="HtmlTitleAdapter" 
     /> 
    </controlAdapters> 
    </browser> 
</browsers> 

Voici un prototype pour l'adaptateur correspondant:

using System.Web; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 

public class HtmlTitleAdapter : System.Web.UI.Adapters.ControlAdapter 
{ 
    protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     HtmlTitle title = Control as HtmlTitle; 

     writer.WriteBeginTag("title"); 
     title.Attributes.Render(writer); 
     writer.Write(">"); 

     if (title.Text != null) 
      writer.Write(title.Text); 

     writer.WriteEndTag("title"); 
    } 
} 

Notez que l'interne render l'implémentation de HtmlTitle diffère quelque peu:

protected internal override void Render(HtmlTextWriter writer) 
{ 
    writer.RenderBeginTag(HtmlTextWriterTag.Title); 
    if (this.HasControls() || base.HasRenderDelegate()) 
    { 
     this.RenderChildren(writer); 
    } 
    else if (this._text != null) 
    { 
     writer.Write(this._text); 
    } 
    writer.RenderEndTag(); 
} 

Je ne suis pas sûr qu'un titre contienne des éléments enfants, donc je ne pense pas que ce soit un problème.

Espérons que cela aide. En outre, il serait beaucoup plus facile d'ajouter cet attribut sur le client en utilisant jQuery.

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("title").attr("lang", "it"); 
    }); 
</script> 
+1

Cela fonctionne - une solution merveilleuse, merci. Je comprends que ce serait facile à faire avec jQuery, mais la principale raison pour laquelle je fais cela est pour les moteurs de recherche afin qu'ils reconnaissent la langue utilisée dans quelques éléments sur la page (balise de titre, et un couple de DIVs). Les moteurs de recherche ne vont pas exécuter JS, ils doivent donc sortir l'attribut LANG directement du serveur. Thx à nouveau. –