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

时间:2010-03-16 08:10:18

标签: asp.net url master-pages

我有一个ASP.net母版页。在这个主人,我已经定义了所有的CSS和JavaScript文件。我还有一些图像和一些按钮和超链接。

所有网址都被声明为亲戚,即“/scripts/ian.js”

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

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

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

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

欢迎任何建议或想法。

由于

5 个答案:

答案 0 :(得分:6)

  

所有网址都被声明为   相对即“/scripts/ian.js”

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

  

此属性指定绝对值   作为基本URI的URI   解析相对URI。

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

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

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

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

希望这有帮助。

答案 1 :(得分:2)

如果*'runat =“server”'属性,大多数代码(包括&lt; link&gt;,&lt; img&gt;等常规HTML标记)都可以使用〜/ 作为应用程序根路径已设定。

例如

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

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

这对&lt; script&gt;的预期效果不正常。虽然。当为脚本标记设置'runat =“server'时,脚本将被视为服务器端javascript并尝试执行。

要解决此问题,您可以使用one of the register client script方法注入javascript。您可以在脚本标记中使用&lt;%= ResolveUrl('〜')%&gt; 标记。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

相反,你必须这样做:

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

这是执行此操作的标准方法,但如果您不是在寻找它,那么额外的标记会让相对路径问题消失,这会让您感到惊讶。