模版頁中難免要引用CSS、腳本、圖片等,這些文件的路徑如果簡單的使用相對路徑,那麼如果引用模版的目錄一發生變化,這些路徑就會出錯;如果使用絕對路徑,又不夠靈活,如果應用程序目錄發生變化,可能會導致要大量修改。asp.net支持一種相對於應用程序的路徑,以波浪線開頭的,形如"~/",使用它即可解決,例如:
<link rel="stylesheet" media="screen" type="text/css" href="<%=ResolveClientUrl("~/css/global.css") %>" />
當然如果你覺得每個路徑都要寫成動態的不爽,而又正好有頁面基類的話,倒是可以換一種方式:
所有的路徑直接書寫爲相對於應用程序目錄的路徑,形如:
<link rel="stylesheet" media="screen" type="text/css" href="~/css/global.css" />
當然默認HTML是不支持的這樣的路徑方式的,這時候就要藉助PageBase了,代碼如下(好像是從DNN的代碼裏面摳出來的):
public abstract class PageBase : Page |
{ |
protected override void Render(HtmlTextWriter writer) |
{ |
StringWriter stringWriter = new StringWriter(); |
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); |
base.Render(htmlWriter); |
string html = stringWriter.ToString(); |
#region 轉換相對路徑 |
MatchCollection collection = Regex.Matches(html, "<(a|link|img|script|input|form).[^>]*(href|src|action)=(///"|'|)(.[^///"']*)(///"|'|)[^>]*>", RegexOptions.IgnoreCase); |
foreach (Match match in collection) |
{ |
if (match.Groups[match.Groups.Count - 2].Value.IndexOf("~") != -1) |
{ |
string url = this.Page.ResolveUrl(match.Groups[match.Groups.Count - 2].Value); |
html = html.Replace(match.Groups[match.Groups.Count - 2].Value, url); |
} |
} |
#endregion |
writer.Write(html); |
} |
} |
發表於 2006年9月19日 23