XHTML PageFilter umgehen

Written on November 04, 2004

Während meiner Arbeiten an der neuen Website zu .NET Golf (dem Nachfolger des inzwischen legendären ASPGolf), bin ich auf folgendes Problem im Zusammenhang mit dem in meinem Artikel "XHTML Strict 1.0 mit ASP.NET 1.1" vorgestellten XHTML-PageFilterModul gestossen:

Wir erzeugen das CSS-File dynamisch (Details zu diesem und anderen Themen gibt es in Kürze in einem weiteren Artikel) und geben ihm hierzu die Endung .css.aspx, um eine Ausführung durch die ASP.NET Page Engine zur erlauben.

Der Einfachheit halber arbeiten wir in diesem Fall mit Inline-Code, also ohne CodeBehind.

Nun tritt folgender Effekt ein:

Solange die .css.aspx-Seite wenigstens ein abschließendes -Tag hat, wird der Output der CSS-Klassen problemlos gerendert. Allerdings auch mit dem -Tag, was zur Folge hat, dass z.B. FireFox das CSS-File nicht mehr richtig interpretieren kann.

Lässt man nun aber das -Tag weg und erzeugt ein CSS-File, wie es eigentlich sein sollte, wird überhaupt kein CSS-Output erzeugt, man erhält stattdessen folgende CSS/HTML-Datei (im IE):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

Die Lösung findet sich in der Art und Weise, wie das PageFilter-Modul arbeitet und den ResponseFilter für XHTML initialisiert.

private void InstallResponseFilter(object sender, EventArgs e)
{
HttpResponse response = HttpContext.Current.Response;

if(response.ContentType == "text/html")
response.Filter = new XHtmlPageFilter (response.Filter);
}

Das Modul prüft also, ob es sich bei dem aktuellen Content um "text/html" handelt. Ist dies der Fall, wird der XHtmlPageFilter angewandt - und genau das verursacht das o.g. Problem, da wir ja eigentlich keinen HTML-Content erzeugen.

Die Lösung ist letztlich äußerst einfach: Der Content-Type der .css.aspx-Datei darf nicht "text/html" sein, damit das XHTML-Modul den XhtmlPageFilter nicht initialisiert:

<%Response.ContentType="text/css";%>

Chris' Kommentar: "Schwere Geburt" ;-)