Jag har hållit en ganska lång diskussion med en del här på forumet i HTML, CSS, XHTML forumet. Den heter "ladda in externa stylesheets och xml länkar"...
Jag har löst problemet jag hade från början, och jag har nu även fixat till min kod lite.
Antingen skickas koden med <?xml-stylesheet href="..." media="..."?> processing instructions, samt en xml deklaration högst upp, samt MIME typen application/xhtml+xml eller så skickas MIMEet text/html utan en xml deklaration eller några processing instructions.
xml till moderna browsers, text/html till IE och gamla. Den kollar ServerVariables["HTTP_ACCEPT"] för att avgöra om den kan skicka eller inte.
I min (inviduella) (bara Default.aspx än så länge) code behind fil har jag:
protected void Page_Load(object obj, EventArgs e)
{
//denna kod tar hand om kollen för att infoga style sheet länkarna
string httpAccept = Request.ServerVariables["HTTP_ACCEPT"];
/*Response.CacheControl = "No-cache";*/
if(httpAccept!=null && httpAccept.IndexOf("application/xhtml+xml") != -1)
{
/*Response.ContentType = "application/xhtml+xml";*/ //detta är satt av ContentType2.dll redan!!
Response.Write("<?xml version=\"1.0\"?>\n"); //eftersom läsaren klarar av detta, använd det.
Response.Write("<?xml-stylesheet type=\"text/css\" href=\"styles/1.css\" media=\"screen,projection\"?>\n");
Response.Write("<?xml-stylesheet type=\"text/css\" href=\"styles/1-print.css\" media=\"print\"?>");
}
else {
Response.ContentType = "text/html";
}
}
och i en http modul som heter ContentType2.dll har jag (läs bara snabbt igenom):
using System;
using System.Web;
using System.Collections;
public class ContentType2 : IHttpModule
{
//denna klass tar hand om MIME typen på alla sidor på webbplatsen.
public void Init(System.Web.HttpApplication application)
{
application.PreSendRequestHeaders += new EventHandler(this.Application_PreSendRequestHeaders);
}
private void Application_PreSendRequestHeaders (object sender, System.EventArgs e)
{
HttpApplication app = ((HttpApplication)(sender));
HttpContext context = app.Context;
string httpAccept = context.Request.ServerVariables["HTTP_ACCEPT"];
if (httpAccept!=null && httpAccept.IndexOf("application/xhtml+xml") != -1)
context.Response.ContentType = "application/xhtml+xml";
else context.Response.ContentType = "text/html";
}
public void Dispose() {}
}
Samt så har jag i mitt <head> element _alltid_
<link href="styles/1.css" type="text/css" media="screen,projection" rel="stylesheet" />
<link href="styles/1-print.css" type="text/css" media="print" rel="stylesheet" />
inkluderat. (det är alltså detta jag vill komma ifrån och enbart ha detta om IE eller annan gammal webbläsare besöker sidan - läs nedan)
Jag vill komma ifrån att behöva skriva dessa link element på min sida för att IE ska kunna visa style sheets. Istället vill jag att min code behind eller min modul - alltså min serverkod ska kunna sätta in dessa links i huvudet. Helst modulen, så att det blir lättare att administrera hela siten.
Jag vill då kunna sätta någon slags markör för var jag vill ha mina links element (alltså i mitt head element) och välja om jag vill infoga dem beroende på om det är en webbläsare som klarar application/xhtml+xml eller inte som kommer på besök.
Funderar på en placeholder, men hur skulle man i så fall koda detta i http modulen? Eller om man nu måste skriva det i code behind istället... Hur sätter man i vilket fall som helst "markören" i head elementet för att kunna skriva link-taggarna där?
Jag vill inte använda <% %> i själva dokumentet om det går att undvika.
Någon som vet en lösning?