Rodet head tag i ASP.NET

05-06-2009 | Kommentarer til artiklen 4 kommentarer


Når jeg koder vil jeg så vidt muligt gerne have at den kode jeg skriver, ser rimelig ordentlig ud.
Microsoft har af uvisse årsager valgt at lade HEAD tagget rendere umådelig rodet, når man laver dynamisk HEAD-indhold fra ASP.NET - og når man som jeg og mange andre gerne vil tilføje unikke meta-data dynamisk i forbindelse med søgemaskineoptimering, ja så kan man godt regne med, at ens indhold i head tagget er uhyggelig rodet.

Denne artikel viser lidt .net kode til hvordan man kan få styr på problemet.

Cirka sådan så det ud da jeg forsøgte at lave mit indhold i head dynamisk:

<head><title>
Dette er min side titel</titel><meta http-equiv="content-language" content="da" /><meta name="description" content="beskrivelse" /></head>


...Og så videre ud i én lang køre med meta, css, javascript referencer o.l på én linie.
Gad vide om det er en lille joke fra Microsoft… ”Rodehoved”? (instant rim shot)

Jeg lader det være uvist om det har SEO-mæssig værdi at head tagget er pænt sat op. Det er der forskellige meninger om. Jeg vil dog vove den påstand, at søgemaskinerne i 2009 sagtens kan forstå det selvom koden står på én lang linje. Umiddelbart kan jeg ikke se hvorfor det skulle være en hindring for søgerobotterne... Men bare risikoen for at det kan have skadende virkning på søgemaskineoptimering, er nok for mig til at jeg ”tager hånd i hanke” med problemet.
Og så er det jo – som sagt – lækkert med pæn og overskuelig kode.

Efter en rum tid på google, fandt jeg en løsning på problemet.
Tricket består i, at gøre brug af controlAdapters til at rendere head-tagget ordentligt.
Løsningen jeg fandt, var skrevet i C# og kan læses på linket lige ovenfor.
Den har jeg imidlertid omskrevet til VB, så jeg har den i begge versioner til forskellige projekter.

Herunder er VB’en jeg lavede, så der findes en løsning til begge sprog.

Filen Browsers.Browser i mappen App_Browsers

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlHead" adapterType="HtmlMess.HtmlHeadAdapter" />
      <adapter controlType="System.Web.UI.HtmlControls.HtmlLink" adapterType="HtmlMess.HtmlLinkAdapter" />
      <adapter controlType="System.Web.UI.HtmlControls.HtmlMeta" adapterType="HtmlMess.HtmlMetaAdapter" />
    </controlAdapters>
  </browser>
</browsers>

 

Og her er namespacet med de forskellige klasser, der håndterer elementerne i HEAD tagget.

Namespace HtmlMess
Public Class HtmlHeadAdapter
        Inherits System.Web.UI.Adapters.ControlAdapter
        Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter)
            writer.WriteLine("<head>")
            Dim headTag As HtmlHead = DirectCast(Me.Control, HtmlHead)
            Dim controls As ControlCollection = headTag.Controls
            For i As Integer = 0 To controls.Count - 1
                Dim c As Control = controls(i)
                headTag.Controls(i).RenderControl(writer)
            Next

            writer.Write("<title>")
            writer.Write(Page.Title)
            writer.WriteLine("</title>")
            writer.Write("</head>")
        End Sub
    End Class

Public Class HtmlLinkAdapter
        Inherits System.Web.UI.Adapters.ControlAdapter
        Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter)
            Dim linkTag As HtmlLink = DirectCast(Me.Control, HtmlLink)
            writer.Write("<link")
            Dim attributes As AttributeCollection = linkTag.Attributes
            Dim keys As IEnumerator = linkTag.Attributes.Keys.GetEnumerator()
            While keys.MoveNext()
                Dim key As String = DirectCast(keys.Current, String)
                writer.Write(" ")
                writer.Write(key)
                writer.Write("=""")
                writer.Write(attributes(key))
                writer.Write("""")
            End While
            writer.WriteLine(" />")
        End Sub
    End Class

Public Class HtmlMetaAdapter
        Inherits System.Web.UI.Adapters.ControlAdapter
        Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter)
            Dim metaTag As HtmlMeta = DirectCast(Me.Control, HtmlMeta)
            If metaTag.HttpEquiv & "" <> "" Then
                writer.Write("<meta http-equiv=""")
                writer.Write(metaTag.HttpEquiv)
                writer.Write(""" content=""")
                writer.Write(metaTag.Content)
                writer.WriteLine(""" />")
            ElseIf metaTag.Name & "" <> "" Then
                writer.Write("<meta name=""")
                writer.Write(metaTag.Name)
                writer.Write(""" content=""")
                writer.Write(metaTag.Content)
                writer.WriteLine(""" />")
            End If
        End Sub
    End Class
End Namespace



En lidt hurtig teknisk demonstration af hvordan det kan rettes. Jeg brugte som sagt et godt stykke tid på at få styr på det. Nu håber jeg det kan spare andre, der gerne vil have styr på head-tagget, lidt tid.

 

Kommentarer
#1
11-06-2009
Christian
Christian skrev:

Hej
Tak for gennemgang. Det har også irriteret mig til tider.

Vil prøvw koden næste gang jeg laver en side.



#2
12-06-2009
Kasper
Kasper skrev:

Godt du kunne bruge det. Håber du får det til at virke. ;)



#3
19-06-2009
Daniel Nøhr
Daniel Nøhr skrev:

Nu programmere jeg selv .net, og kan sagtens følge situationen, og har tit selv brugt dette trick, MEN, jeg tror absolut ikke det har den helt store seo virkning om ens meta og andet i HEAD er pænt tabbed in på siden, eller om det står i en køre.

Har ihvertfald personligt ikke haft noget problem på mine sider.

Men godt at se flere benytter denne løsning til at rette "problemet", syntes også klart det er den pæneste løsning, nu når microsoft ikke selv gør noget ved det.



#4
20-06-2009
Kasper Lau
Kasper Lau skrev:

Hej Daniel.
Jeg tror heller ikke på, at det kan have en betydning ift SEO.
Nu når Google kan finde ud af, at ignorerer invalid html, så som tables eller divs der ikke er lukkede, hvorfor skulle den så være så dum, ikke at læse head-tagget ordentligt bare fordi det står lidt rodet?

Men løsningen er jo ret nem at implementere. Når den først er skrevet, er det jo bare at kopierer filerne direkte over i projektet. Derfor benytter jeg den også i høj grad - som du selv siger, mest for at få en pænere løsning.

Get in the game MS :)




Skriv en kommentar

Navn
Evt. URL
Email
Kommentar
  Gem indlæg

Seneste indlæg

Spot indlæg

L4U - blog om SEO

  • Halløj, jeg hedder Kasper Lau.
    Jeg arbejder til dagligt med søgemaskineoptimering og webudvikling i Århus.

    Bloggen her eksisterer pga. min interesse inden for søgemaskineoptimering og det er da også SEO, bloggen handler om.
    Du kan forvente at finde artikler om alt indenfor internet og SEO, så hvis du synes dét er interessant, så kig dig endelig lidt omkring.


    SEO - Kasper Lau