【问题标题】:.NET base href & stylesheet links in subfolder子文件夹中的 .NET 基本 href 和样式表链接
【发布时间】:2012-10-09 07:09:34
【问题描述】:

我想我会使用 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>

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

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

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

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

【问题讨论】:

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


    【解决方案1】:
    <link href="<%= ResolveClientUrl("~/css/main.css") %>" rel="stylesheet" type="text/css" />
    

    【讨论】:

    • 是的,它可以工作,但它不适用于任何具有runat="server" 属性的控件。见this question
    【解决方案2】:

    尝试使用~,如&lt;link rel="stylesheet" type="text/css" href="~/css/main.css" /&gt;

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

    【讨论】:

    • 我假设你的意思是 runat="server"?不,它仍然会剥离 tilfe 并替换为“../”。如果我删除了基本标签,那么它可以工作,但是我的脚本标签被破坏了。然后如何解析脚本标签?
    • 我会说省略 base 标记,因为这可能会混淆 ASP.NET。尝试在脚本标签上也使用波浪号(使用runat="server"
    • 你不能在脚本标签上使用波浪号,因为你必须添加“runat=server”,它会在服务器上执行脚本(javascript)。
    • 基本标签似乎非常有用:它在一个地方定义了您的根。对于浏览器来说,将基础设置在一个地方似乎是一种非常优雅的方式(毕竟,浏览器需要解析它随后调用的相对 URL,所以这是浏览器问题,而不是服务器问题)。问题是带有 runat=server 的 head 标签会干扰链接标签的 href (当页面在服务器上生成时) - 否则它将是完美的。在我的回答中查看我的解决方法。如果我发现任何问题会回复。
    • 您完全误解了 IIS 对 URL 的解释以及虚拟目录的使用。不需要基本标签。
    【解决方案3】:

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

    奇怪,但真实。

    【讨论】:

    • base 的 href 值实际上不会被硬编码,它会从数据库中的设置表中写入一个值,该值在应用程序启动时加载到内存中。所以它实际上是:&lt;base href="&lt;%=Settings.Configuration.website_rooturl%&gt;" /&gt;。我正在使用下面对您的帖子的评论中解释的基本标记,以使其可在多个环境中安装而无需更改任何内容(数据库表中的 website_rooturl 值除外)。
    【解决方案4】:

    使用 '~' (tilda) 运算符从根目录解决它。您还需要添加 runat="Server" 属性才能使其工作:

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

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

    【讨论】:

    • 不,不起作用。我必须删除我不想这样做的基本标签,否则脚本标签无法解析。
    • 将脚本和 CSS 文件从解决方案资源管理器拖到代码视图中的母版页标题中,将为您创建正确的相对路径。如果这不起作用,请尝试脚本路径的不同路径(VS 中的错误)。
    • 你好。谢谢,但我可以让它在我当前的开发环境中工作。不过,我正在尝试使其与环境无关。因此,如果它安装在 localhost 的根目录或域的根目录中,或者安装在 localhost 的子文件夹中(如上所示),或者是域上的虚拟目录等。我想要一种适用于所有这些的解决方案。试试我自己解释的,你会看到奇怪的行为在起作用!
    • 无论哪种方式,您都不需要 base,也不应该将 localhost 硬编码到路径中 - 这在两种环境中都无法无缝工作。
    • 正如我在其他评论中所解释的,它来自数据库字段。我希望它存储在一个地方(在数据库中),并输出到一个地方的“页面”(母版页上的基本标签)。如果我可以使用一次基本标记,我不想在每个链接中都使用该值。
    【解决方案5】:

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

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

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

    除了 OP 的 &lt;link&gt; 标签外,&lt;asp:ImageButton&gt; 标签也同样受到影响。这个 hack 修复了这两个问题。

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 2014-08-08
      • 2015-09-21
      • 2020-12-18
      • 2012-05-24
      • 2011-07-15
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多