Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有虚拟目录的ASP.net母版页中的基本URL_Asp.net_Url_Master Pages - Fatal编程技术网

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

具有虚拟目录的ASP.net母版页中的基本URL,asp.net,url,master-pages,Asp.net,Url,Master Pages,我有一个ASP.net母版页。在这个主文件中,我定义了所有css和javascript文件。我也有一些图片,一些按钮和超链接 所有URL都声明为相对的ie“/scripts/ian.js” 如果这个网站是根网站,一切都正常,但我需要它在虚拟目录中工作 我的问题是,当我将此网站放在根站点下的虚拟目录中时,我的所有链接都指向根站点。所以我的链接指向www.root.com/scripts/ian.js,但应该指向www.root.com/virtualDir/scripts/ian.js 我原以为标

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

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

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

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

我原以为标题中的标签会有帮助,但到目前为止,它似乎在任何方面都没有帮助。当我将鼠标悬停在所有链接上时,它们仍然指向根网站

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

欢迎提出任何建议或想法

谢谢

在yout reference(即~/scrips/ian.js)中使用tilde(~)。看看它是否有效
有关链接,请尝试.aspx页面中的Page.ResolveUrl。

大多数标记,包括常规HTML标记,如, 这将使标记成为服务器标记,并且在将输出返回到浏览器之前,tilde将替换为应用程序根

不过,这并没有像预期的那样对整个系统起作用。当为脚本标记设置“runat=”server”时,该脚本将被视为服务器端javascript并尝试执行

要解决这个问题,您可以使用方法注入javascript。您可以在脚本标记中使用标记

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

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

此属性指定绝对值 充当的基本URI的URI 解析相对URI

--从

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

如果做不到这一点,我倾向于绕开这样的问题,您可以使用与其他人建议使用ResolveUrl相同的方法:


...
“alt=“…”/>

希望这有帮助。

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

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

相反,您必须这样做:

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


这是执行此操作的标准方法,但如果您不寻找它,您可能会感到惊讶,因为附加的标记会使相对路径问题消失。

是否没有全局设置可以设置,这样我就不必去更新所有链接、图像、脚本等?附:据我所知不是这样。我尝试总是使用“~”相对路径或文件夹相对路径,例如“./某物”。这允许将来移动应用程序。一个好的查找/替换正则表达式应该能够捕获大多数(如果不是所有)有问题的链接。虽然您可以将“~”与runat=server一起用于CSS文件引用,但对JavaScript文件这样做很可能会导致错误,因为这将强制服务器端执行JavaScript代码。不,tilde不适用于脚本。当服务器尝试执行脚本时,您将得到一个错误。
<script src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/scripts/ian.js" language="javascript" type="text/javascript"></script>
<script src="/js/file.js"></script>
<script src="/js/file.js" type="text/javascript"></script>