.NET base href&子文件夹中的样式表链接

时间:2012-10-18 18:23:03

标签: asp.net iis href base relative-url

我以为我会使用base href标记来使我的相对网址适用于不同的安装。

在我的母版页中,我有:

<base href="http://localhost/myproject/" />
<link rel="stylesheet" type="text/css" runat="server" href="css/main.css" />
<script type="text/javascript" src="js/jquery.min.js"></script>

我在http://localhost/myproject/default.aspx时工作正常,css路径可以很好地解决,例如:http://localhost/myproject/css/main.css

但是我有一个子文件夹,报道。当我导航到http://localhost/myproject/reports/default.aspx并查看来源时,这就是我所看到的:

<base href="http://localhost/myproject/" />
<link rel="stylesheet" type="text/css" href="../css/main.css" />
<script type="text/javascript" src="js/jquery.min.js"></script>

某些内容已将../注入href标记的link属性,这意味着它正在解析为:http://localhost/css/main.css未找到。

这很奇怪,因为它正如我对脚本标记所期望的那样工作;只是链接标记获得此注入。我在IE&amp; Chrome和两者都是相同的,所以我认为它是IIS / .NET正在这样做,但它们不应该真正触及HTML,因为它不是runat="server"。稍微玩一下,我看到Master页面上的链接标签被修改,但不是脚本标签(如果它们是没有前导“/”的相对URL)。我认为那是因为它们是“src”属性而不是“href”属性。因此,拥有/不拥有base href将修复一种类型,但会破坏另一种类型。

我疯了,这是一个错误,还是我把它弄错了?

编辑: 我实际上并没有硬编码基本标签的href。我正在写出从数据库表加载到应用程序内存的设置的值。所以它实际上是这样做的:<base href="<%=Settings.Configuration.website_rooturl%>" />在我的开发机器上,值可以是http://localhost/http://localhost/project/,在一个客户端站点上它是http://www.clientsite.com/而另一个客户端站点是虚拟目录{ {1}}。

5 个答案:

答案 0 :(得分:2)

<link href="<%= ResolveClientUrl("~/css/main.css") %>" rel="stylesheet" type="text/css" />

答案 1 :(得分:1)

尝试使用~,如<link rel="stylesheet" type="text/css" href="~/css/main.css" />

在ASP.NET应用程序中,~引用应用程序的根目录。

答案 2 :(得分:1)

问题显然是这个。因为我有head标记runat="server"link样式表&amp; favicon标签被视为HtmlLink控件,因此href属性的呈现方式不同(使用../)注入。

这似乎解决了这个问题,因为内联代码中的空双引号强制它作为HTML控件输出,而不是HtmlLink ASP.NET Web控件:

<base href="http://localhost/myproject/" />
<link rel="stylesheet" type="text/css" runat="server" href="<%=""%>css/main.css" />
<script type="text/javascript" src="js/jquery.min.js"></script>

奇怪,但确实如此。

答案 3 :(得分:0)

使用“~”(tilda)运算符从根解析它。您还需要为此工作添加runat="Server"属性:

<link rel="stylesheet" type="text/css" runat="server" 
    href="~/css/main.css" runat="server" />

您的站点不需要数据库的基本标记值来处理不同的安装。完全失去它。您还可以在不同服务器上以任何方式配置虚拟目录。

答案 4 :(得分:0)

我意识到这是一个非常古老的问题,但我今天遇到了同样的问题(在最初的帖子后五年),我能够像这样解决它。

<%="<base href='" + Page.ResolveUrl("~/") + "'/>" %>
<!-- or however you want to get the base -->

显然,ASP.NET会在页面中找到base标记,并对其他服务器端标记执行操作。所以,我刚刚做到这一点,引擎并没有把它看成是一个控件。它是一个黑客,但它确实有效。

除了OP <link>标记之外,<asp:ImageButton>标记同样受到影响。这个黑客修复了两者。