我有一个使用主题的ASP.NET应用程序。让我假装我有一个名为“MySkin”的主题。
我的页面位于我的应用程序的子目录中。当我引用一个使用“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" />
这是浏览器兼容性问题还是有其他原因?
我问的原因是因为我使用Server.Execute渲染我的ASP.NET页面并将结果存储在不同的目录中。因此,我更愿意使用第二种方式来引用我的主题的CSS。
谢谢!
答案 0 :(得分: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);
使用此方法的坏处是,如果应用程序网址发生更改,您的链接就会中断。
为了最大限度地减少此类更改影响,您可以使用html include代替基本标记,以包含包含基本标记的文件,如下所示:
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>
<强>更新强> 这是在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));
}