webForumDet fria alternativet

Application_PreSendRequestHeaders --> XML

5 svar · 529 visningar · startad av echoSwe

echoSweMedlem sedan nov. 20041 467 inlägg
#1

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?

zcorpanMedlem sedan dec. 20042 269 inlägg
#2

Du kanske kan öppna HTML- och HEAD-elementen i skriptet istället för i dokumentet. Typ:

	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\"?>\n");
		Response.Write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n");
		Response.Write("<html xmlns=\"http://www.w3.org/xhtml\">\n");
		Response.Write("<head>");
	}
	else {
		Response.ContentType = "text/html"; 
		Response.Write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n");
		Response.Write("<html xmlns=\"http://www.w3.org/xhtml\">\n");
		Response.Write("<head>\n");
		Response.Write("<link rel=\"stylesheet\" type=\"text/css\" href=\"styles/1.css\" media=\"screen,projection\" />\n");
		Response.Write("<link rel=\"stylesheet\" type=\"text/css\" href=\"styles/1-print.css\" media=\"print\" />");
	}
echoSweMedlem sedan nov. 20041 467 inlägg
#3

Jo, det kan ju fungera. Men då måste jag fortfarande lägga in den här koden i varje fils bakgrundskod, och det blir kanske lite omständigt...

Kan man inte på något sätt söka i aspx filen som man skulle göra i ett xml dokument och på så sätt lägga till child noden till <head>; <link ...>, för att sedan skicka det till clienten?

zcorpanMedlem sedan dec. 20042 269 inlägg
#4

Eller så anger du encoding i HTTP headern, samt använder bara LINK för att länka in stilmallen, och struntar i både META-element och XML-biten i prologen. :)

echoSweMedlem sedan nov. 20041 467 inlägg
#5

Ja ;) Kanske det. Det får vara som det är nu.
Kolla om ni vill på hur koden blir renderad... Adressen är ju i min signatur.

zcorpanMedlem sedan dec. 20042 269 inlägg
#6

Det här kanske kan hjälpa: http://www.smackthemouse.com/xhtmlxml :)

Genererad på 385 ms · cache AV · v20260730165559-full.f96bc7eb