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.
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.
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 :)