2

我想我会使用base href标签来让我的相对 URL 在不同的安装上工作。

在我的母版页中,我有:

<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 和 Chrome 中查看了源代码,两者都是相同的,所以我认为是 IIS/.NET 正在这样做,但他们不应该真正触及 HTML,因为它不是runat="server". 稍微玩一下,我看到母版页上的链接标签被修改,但不是脚本标签(如果它们是没有前导“/”的相对 URL)。我认为这是因为它们是“src”属性而不是“href”属性。因此,拥有/不拥有base href将修复一种类型,但会破坏另一种类型。

我疯了,这是一个错误,还是我拿错了?

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

4

5 回答 5

2
<link href="<%= ResolveClientUrl("~/css/main.css") %>" rel="stylesheet" type="text/css" />
于 2013-04-23T23:37:41.693 回答
1

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

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

于 2012-10-18T18:43:47.623 回答
1

问题显然是这样的。因为我有一个head带有 的标签runat="server",所以link样式表和网站图标标签被视为 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>

奇怪,但真实。

于 2012-10-18T18:54:56.713 回答
0

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

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

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

于 2012-10-18T18:47:02.533 回答
0

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

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

显然,当在页面中找到该标记时,ASP.NET 会对其进行解释base,并对其他服务器端标记执行操作。所以,我只是做了它,以便引擎不会将其视为控件。这是一个黑客,但它的工作。

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

于 2017-09-20T21:06:11.260 回答