代码之家  ›  专栏  ›  技术社区  ›  SetiSeeker

具有虚拟目录的ASP.NET母版页中的基URL

  •  5
  • SetiSeeker  · 技术社区  · 15 年前

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

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

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

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

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

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

    欢迎提出任何建议或想法。

    谢谢

    5 回复  |  直到 10 年前
        1
  •  6
  •   Ian Oxley    15 年前

    所有URL都声明为 相对ie“/scripts/ian.js”

    这些似乎是您正在使用的绝对URL,而不是相对URL,这可能就是为什么 <base /> 标签没有预期效果:

    此属性指定 用作的基URI的URI 解析相对URI。

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

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

    如果不成功,我倾向于使用 ResolveClientUrl 为了解决像这样的问题,你会用和其他人建议使用的相同的方法。 解毒剂 :

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

    希望这有帮助。

        2
  •  2
  •   kervin    15 年前

    大多数标记,包括常规HTML标记(如<link>、<img>)都可以使用 ~/ 如果设置了*'runat=“server”'属性,则作为应用程序根路径。

    如。

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

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

    不过,对于脚本<来说,这并不像预期的那样工作。什么时候? 'runat=“服务器” 为脚本标记设置,然后将脚本视为服务器端的javascript并尝试执行。

    要解决这个问题,您可以使用 one of the register client script 方法。您可以使用 <%=resolveurl('~')%> 在脚本标记中标记。

        3
  •  2
  •   meir    14 年前

    此静态方法返回应用程序根文件夹(网站或虚拟目录)的完整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
  •  0
  •   hallie    15 年前

    在您的引用(即~/scrips/ian.js)中使用tilde(~)。 对于链接,请在.aspx页中尝试page.resolveurl。

        5
  •  0
  •   Andy    10 年前

    所以我昨晚发现这很奇怪:

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

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

    相反,您必须这样做:

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

    这是实现这一点的标准方法,但是如果您不寻找它,那么额外的标记会使相对路径问题消失,这会让您感到惊讶。