2009-06-03 4 views
2

У меня есть приложение ASP.NET, которое использует темы. Давайте притворимся, что у меня есть тема под названием «MySkin».ASP.NET - Темы и относительные ссылки

У меня есть страница, которая находится в подкаталоге моего приложения. Когда я ссылаюсь на страницу, использующую «MySkin», я заметил, что ASP.NET отображает элемент ссылки, который подходит к корню сайта, а затем вниз в каталог App_Themes. Вот пример ссылка элемент я нашел в тонированной странице ASP.NET:

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

Есть ли причина того, что оказанная ссылка элемент не использует следующий вместо:

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

Является ли это браузер проблема совместимости или есть другая причина?

Причина, по которой я прошу, заключается в том, что я обрабатываю страницу ASP.NET с использованием Server.Execute и сохраняет результат в другом каталоге. Из-за этого я предпочел бы использовать второй способ ссылки на css моей темы.

Спасибо!

ответ

0

Согласно встроенному внутреннему классу PageThemeBuildProvider, ASP.NET создать относительный путь для CSS файлов, включенного в каталоге темы

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

Чтобы преодолеть проблему, вы можете попробовать использовать базовый тег:

//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); 

Плохая вещь об использовании этого подхода - ваши ссылки будут разорваны, если URL-адрес приложения будет изменен.

Чтобы минимизировать такое влияние изменения, вы можете использовать HTML включают вместо базового тега включить файл, содержащий базовый тег следующим образом:

base.html содержит:

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

это может создан по применению начинают запрос:

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(); 
       } 
      }    
     } 

и добавляют в качестве буквального управления для вашего ASPX:

//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 содержит:

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

UPDATE: Это было проверено при сервере разработки asp.net, если организовано как приложение под IIS AppRoot не будет решена правильно. Для получения правильных приложений абсолютное использование 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)); 
} 
Смежные вопросы