2010-03-16 86 views
5

我有一个ASP.net母版页。在这个大师中,我定义了所有的CSS和JavaScript文件。我也有一些图像和几个按钮和超链接。带有虚拟目录的ASP.net主页中的基本URL

的所有网址都被宣布为相对的,即“/scripts/ian.js”如果这个网站是根网站

一切工作正常,但我需要它在一个虚拟目录工作。

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

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

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

欢迎任何建议或想法。

感谢

回答

6

的所有网址都被宣布为 相对即 “/scripts/ian.js”

那些似乎是绝对网址,你正在使用,而不是相对的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="..." /> 

希望这有助于。

0

使用符号(〜)在YOUT引用(即〜/ scrips/ian.js)...看看它是否工作 对于链接尝试Page.ResolveUrl在.aspx页面。

+0

不,代字号不适用于脚本。当服务器尝试执行脚本时,您会收到错误消息。 – 2013-10-31 23:29:00

2

大多数标记,包括像<链接>,<IMG>等可以使用〜/作为应用程序的根路径,如果*“RUNAT =‘服务器’”属性设置标准的HTML标签。

例如。

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

这使得标签的服务器标签和波浪线被替换为应用程序根的输出被返回到浏览器之前。

虽然这不符合<脚本>的预期。当“RUNAT =“服务器”设置为脚本标记,那么脚本被认为是服务器端JavaScript和执行尝试。

要解决这一点,你可以注射使用one of the register client script方法的JavaScript。你可以在你的脚本标签使用<%= RESOLVEURL( '〜')%>标签。

+0

有没有我可以设置的全局设置,所以我不必去更新所有的链接,图像,脚本等? PS。 Thx – SetiSeeker 2010-03-16 09:58:45

+0

不是我所知道的。我尝试始终使用“〜”相对路径或文件夹相对路径,例如。 “../something”。这允许将来移动应用程序。一个好的发现/替换正则表达式应该能够捕获大部分(如果不是所有的)违规链接。 – kervin 2010-03-16 18:17:45

+0

对于CSS文件引用,您可以在runat = server中使用“〜”,但对JavaScript文件这样做很可能会导致错误,因为它会强制服务器端的JavaScript执行代码。 – 2013-10-31 23:27:58

2

这个静态方法将返回完整的HTTP路径到您的应用程序(Web站点或虚拟目录)的根文件夹

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> 
0

所以我昨天晚上发现这个IIS奇怪:

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

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

相反,你必须做这样的:

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

这是做它的标准方式,但如果你不找它,它可以是额外的代码会相对会让你大吃一惊路径问题消失。