【问题标题】:Base URL in ASP.net Master Pages with virtual Directories带有虚拟目录的 ASP.net 母版页中的基本 URL
【发布时间】:2011-01-28 00:19:03
【问题描述】:

我有一个 ASP.net 母版页。在这个大师中,我定义了所有的 css 和 javascript 文件。我还有一些图片和一些按钮和超链接。

所有的url都被声明为相对的,即“/scripts/ian.js”

如果这个网站是根网站,一切正常,但我需要它在虚拟目录中工作。

我的问题是当我将此网站放在根站点下的虚拟目录中时,我的所有链接都指向根站点。所以我的链接指向 www.root.com/scripts/ian.js 但它应该指向 www.root.com/virtualDir/scripts/ian.js

我认为标题中的Base Href 标记会有所帮助,但到目前为止它似乎并没有帮助。当我将鼠标悬停在它们上面时,所有链接仍然指向根网站。

我想要的是 IIS 或配置文件中的单个设置,我可以设置根 url 和母版页或内容页上的任何图像、脚本或链接,将指向正确的位置。

欢迎任何建议或想法。

谢谢

【问题讨论】:

    标签: asp.net url master-pages


    【解决方案1】:

    所有的url都声明为 相对即“/scripts/ian.js”

    这些似乎是您正在使用的绝对 URL,而不是相对 URL,这可能是 <base /> 标记没有达到预期效果的原因:

    该属性指定一个绝对值 充当基本 URI 的 URI 解析相对 URI。

    --来自http://www.w3.org/TR/html401/struct/links.html#h-12.4

    您可以尝试从 URL 中删除前导“/”,看看是否有效?

    如果做不到这一点,我倾向于使用 ResolveClientUrl 来解决此类问题,您可以像其他人建议的那样使用 ResolveUrl

    <script type="text/javascript" src="<%= ResolveClientUrl("~/path/to/js") %>"></script>
    ...
    <img src="<%= ResolveClientUrl("~/path/to/img") %>" alt="..." />
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果设置了 *'runat="server"' 属性,大多数标签,包括常规 HTML 标签,如 等,都可以使用 ~/ 作为应用程序根路径.

      例如。

      <img src="~/images/test.png" runat="server" />
      

      这使标记成为服务器标记,并且波浪号在输出返回到浏览器之前被应用程序根替换。

      这对于

      要解决此问题,您可以使用 one of the register client script 方法注入 javascript。你可以在你的脚本标签中使用 标签。

      【讨论】:

      • 我没有可以设置的全局设置,所以我不必去更新所有的链接、图像、脚本等吗? PS。谢谢
      • 我不知道。我尝试始终使用“~”相对路径或文件夹相对路径,例如。 “../某物”。这允许将来移动应用程序。一个好的查找/替换正则表达式应该能够捕获大部分(如果不是所有)违规链接。
      • 虽然您可以使用 "~" 和 runat=server 来引用 CSS 文件,但对 JavaScript 文件这样做很可能会导致错误,因为它会强制在服务器端执行 JavaScript 代码。
      【解决方案3】:

      此静态方法返回您应用程序根文件夹(网站或虚拟目录)的完整 http 路径

      public static string GetAppRootUrl(bool endSlash)
      {
          string host = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
      
          string appRootUrl = HttpContext.Current.Request.ApplicationPath;
          if (!appRootUrl.EndsWith("/")) //a virtual
          {
              appRootUrl += "/";
          }
          if (!endSlash)
          {
              appRootUrl = appRootUrl.Substring(0, appRootUrl.Length - 1);
          }
          return host + appRootUrl;
      }
      

      所以,你可以写在母版页:

      <script src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/scripts/ian.js" language="javascript" type="text/javascript"></script>
      

      【讨论】:

        【解决方案4】:

        在你的参考文献中使用波浪号(~)(即~/scrips/ian.js)...看看它是否有效 对于链接,请尝试 .aspx 页面中的 Page.ResolveUrl。

        【讨论】:

        • 不,波浪号不适用于脚本。当服务器尝试执行脚本时,你会得到一个错误。
        【解决方案5】:

        所以我昨晚发现了这个 IIS 怪异:

        <script src="/js/file.js"></script>
        

        在主 IIS 站点的子目录中的虚拟应用程序中无法正常工作。

        相反,您必须这样做:

        <script src="/js/file.js" type="text/javascript"></script>
        

        这是执行此操作的标准方法,但如果您不是在寻找它,您可能会惊讶地发现,附加标签会使相对路径问题消失。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          相关资源
          最近更新 更多