2009-06-03 15 views
2

Ich habe eine ASP.NET-Anwendung, die Themen verwendet. Stellen wir uns vor, ich hätte ein Thema namens "MySkin".ASP.NET - Designs und Relative Referenzierung

Ich habe eine Seite, die in einem Unterverzeichnis meiner Anwendung ist. Wenn ich auf eine Seite referenziere, die "MySkin" verwendet, habe ich bemerkt, dass ASP.NET ein Linkelement darstellt, das zum Stamm der Site und dann nach unten in das App_Themes-Verzeichnis führt. Hier ist ein Beispiel Verbindungselement I in einer gerenderten ASP.NET-Seite gefunden:

<link href="../../App_Themes/MySkin/theme.css" type="text/css" rel="stylesheet" /> 

Gibt es einen Grund, dass das gerenderte Verbindungselement nicht die nicht verwendet folgende statt:

<link href="/App_Themes/MySkin/theme.css" type="text/css" rel="stylesheet" /> 

Ist das ein Browser Kompatibilitätsproblem oder gibt es einen anderen Grund?

Der Grund, den ich stelle, ist, weil ich meine ASP.NET Seite mit Server.Execute rendere und das Ergebnis in einem anderen Verzeichnis speicherst. Aus diesem Grund würde ich es bevorzugen, die zweite Möglichkeit zu verwenden, um auf das CSS meines Themas zu verweisen.

Vielen Dank!

Antwort

0

Nach dem eingebauten internen Klasse PageThemeBuildProvider, asp.net erstellen relativen Pfad für CSS-Dateien, die in dem Themenverzeichnis

internal void AddCssFile(VirtualPath virtualPath) 
{ 
    if (this._cssFileList == null) 
    { 
     this._cssFileList = new ArrayList(); 
    } 
    this._cssFileList.Add(virtualPath.AppRelativeVirtualPathString); 
} 

Ihr Problem zu überwinden, können Sie versuchen Basis-Tag:

//Add base tag which specifies a base URL for all relative URLs on a page 
System.Web.UI.HtmlControls.HtmlGenericControl g = new System.Web.UI.HtmlControls.HtmlGenericControl("base"); 
//Get app root url 
string AppRoot = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, ""); 
g.Attributes.Add("href",AppRoot); 
Page.Header.Controls.AddAt(0,g); 

Das Schlimme an der Verwendung dieses Ansatzes ist, dass Ihre Links brechen, wenn die Anwendungs-URL geändert wird.

base.html enthält:

<base href="http://localhost:50897"></base> 

könnte dies

solche Änderung Auswirkungen möglichst gering zu halten, können Sie HTML enthalten anstelle des Basis-Tag enthalten eine Datei mit dem Basis-Tag wie folgt verwenden erstellt wird, beginnt auf Anfrage Anfrage:

bool writeBase = true; 
     protected void Application_BeginRequest(object sender, EventArgs e) 
     { 
      if (writeBase) 
      { 
       writeBase = false; 
       //Save it to a location that you can easily reference from saved html pages.     
       string path = HttpContext.Current.Server.MapPath("~/App_Data/base.html"); 
       using (System.IO.TextWriter w = new System.IO.StreamWriter(path, false)) 
       { 
        w.Write(string.Format("<base href=\"{0}\"></base>", HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.PathAndQuery, ""))); 
        w.Close(); 
       } 
      }    
     } 

und als wörtliche Kontrolle zu Ihren aspx hinzugefügt:

//the path here depends on where you are saving executed pages. 
System.Web.UI.LiteralControl l = new LiteralControl("<!--#include virtual=\"base.html\" -->"); 
Page.Header.Controls.AddAt(0,l); 

saved.html enthält:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<!--#include virtual="base.html" --> 
... 
</head> 
.... 
</html> 

UPDATE: Diese unter asp.net Entwicklungs-Server getestet wurde, als Anwendung unter IIS gehostet, wenn der AppRoot wird nicht korrekt aufgelöst werden. Um die korrekten Anwendungen zu erhalten, verwenden Sie die absolute URL:

/// <summary> 
/// Get Applications Absolute Url with a trailing slash appended. 
/// </summary> 
public static string GetApplicationAbsoluteUrl(HttpRequest Request) 
{ 
return VirtualPathUtility.AppendTrailingSlash(string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Request.ApplicationPath)); 
}