我以为我会使用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}}。
答案 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>
标记同样受到影响。这个黑客修复了两者。