Dieser Beitrag beschreibt, wie man ASP.NET dazu bewegen kann, bei einem serverseitig generiertem Title-Tag die normalerweise unnötig erzeugten Zeilenumbrüche beim Rendern wegzulassen.
Das problematische Verhalten
Wer sich mit ASP.NET und dem generierten HTML-Code etwas intensiver beschäft, wird früher oder später über folgendes Verhalten stolpern, welches seit jeher bis heute zur aktuellen .NET-Version 3.5 unverändert in ASP.NET vorhanden ist:
Und zwar wird folgendes "wunderschöne" ASP.NET-HTML-Markup...

...beim Rendern wie folgt an den Browser geschickt:

Es werden seitens der Renderengine unnötige Zeilenumbrüche innerhalb des Title-Tags vorgenommen. Dieses Verhalten ist aus technischer Sicht zwar weitgehend zu vernachlässigen (die Zeilenumbrüche spielen weder bei der Darstellung im Browser noch sonstwie eine technische Rolle), stellt für HTML-Puristen, die das HTML-Markup gerne absolut unter Kontrolle haben, jedoch ein Problem dar, wenn auch ein kleines.
Dieses Verhalten tritt übrigens nur dann auf, wenn das Title-Tag serverseitig gerendert wird, es sich also um ein serverseitiges HTML-Steuerelement handelt, also entweder das umschließende Head- oder das Title-Tag den Runat-Server-Zusatz beinhalten. Ist das nicht der Fall, tastet die ASP.NET-Engine den Code nicht an.
Die Ursache
Nach einiger Recherche zu diesem Thema lässt sich die Ursache wie folgt zusammenfassen:
Es handelt sich hierbei schlicht um einen (Konfigurations-)Fehler in ASP.NET, nämlich dergestalt, dass das HTML-Title-Tag in ASP.NET standardmäßig als Blockelement hinterlegt ist. Und für ASP.NET-Blockelemente sieht das Rendering eben einen Zeilenumbruch nach dem einleitenden und vor dem beendenden Tag vor (so wie beispielsweise bei einem Div-Tag). Dass das Title-Tag als Blockelement voreingestellt ist, ist vermutlich ein Fehler, ein Versehen, eine Geschmacksverwirrung der Entwickler oder was auch immer, zumindest aus meiner Sicht eine verbessernswerte Voreinstellung.
Die Lösung
Die Lösung dieses "Problems" ist theoretisch trivial: Man ändere einfach die Voreinstellung für das ASP.NET-Title-Tag von Block- auf Inline-Element und die Umbrüche werden nicht mehr gerendet. Leichter gesagt als getan, denn dafür muss man zur Laufzeit mit ein wenig Reflection an die Voreinstellungen des HtmlTextWriters heran, und wer kennt sich damit schon aus?
Im Netz kursieren einige Code-Snippets, die diese Korrektur durchführen. Ich selbst verwende bei neuen Projekten derzeit folgenden Code:
public static void InitializeTitleTag()
{
Type type = typeof(HtmlTextWriter);
FieldInfo field = type.GetField("_tagNameLookupArray",
BindingFlags.Static | BindingFlags.NonPublic);
Array lookup = (Array) field.GetValue(null);
const int titleTagIndex = (int) HtmlTextWriterTag.Title;
object value = lookup.GetValue(titleTagIndex);
type = value.GetType();
field = type.GetField("tagType");
field.SetValue(value, 0); // 0 = Inline-Element (Korrektur!)
lookup.SetValue(value, titleTagIndex);
}
Die eigentliche Korrektur findet erst in der vorletzten Codezeile statt, in welcher der TagType des Title-Tags auf 0 gesetzt wird, was einem Inline-Element entspricht.
Diese Methode kann man entweder auf jeder Seite neu aufrufen, oder - meine Empfehlung - in einer eigenen BasePage-Klasse ablegen, welche von System.Web.UI.Page erbt. Im Konstruktor dieser BasePage ruft man dann die oben genannte Methode auf, so dass der Aufruf automatisch geschieht und man die Angelegenheit für das aktuelle Projekt abhaken kann. Die eigenen Seiten erben sodann halt nicht mehr direkt von System.Web.UI.Page sondern von der eigenen BasePage.
Eine eigene BasePage anzulegen hat auch in Zeiten von MasterPages ohnehin noch ein paar weitere Vorteile, dazu aber später mehr.