如何始终解析相对于我的web应用程序根的URL

How to always resolve URLs relative to my web applications root?

本文关键字:应用程序 URL web 我的 何始终 相对于      更新时间:2023-09-26

我有一个web应用程序,它是一个JavaScript文件,会有以下代码行:

var arrowimages = { down: ['downarrowclass', 'images/AppNavDownArrow.gif', 23], right: ['rightarrowclass', 'images/AppNavRightArrow.gif'] }

当我处于web应用程序的根目录时,对图像的引用正在按预期工作。当我浏览到应用程序中的子文件夹时,它会将相同的子文件夹添加到图像URL中,并且不会加载。

当我在应用程序的子文件夹中时,如何修改代码,使其指向创建图像路径?

您应该使用/引导路径。这样,路径将始终从域根解析。

var arrowimages = { down: ['downarrowclass', '/images/AppNavDownArrow.gif', 23], right: ['rightarrowclass', '/images/AppNavRightArrow.gif'] }

否则,它们将被解析为相对于当前URL的;通过将路径固定到当前文件夹的末尾(除非您正在使用<base/ >标记(如果您正在使用,请将其移除))。

如果您的应用程序位于子文件夹中(例如。http://example.com/myapp),则需要在路径前面加上myapp,例如;/myapp/images/AppNavDownArrow.gif

对于可移植的解决方案,您可能需要考虑使用一个配置参数来存储应用程序的根目录(例如root = /myapp/)。然后,您可以在JavaScript中的config对象中输出此参数,如我的另一个答案所述。你的网址会是这样的;

var arrowimages = { down: ['downarrowclass', config.base + '/images/AppNavDownArrow.gif', 23], right: [config.base + '/rightarrowclass', '/images/AppNavRightArrow.gif'] } 

使用/images/AppNavDownArrow.gif而不是images/AppNavDownArrow.gif

尽管您可以在路径前面加上"/"来映射到域根,但在ASP.NET中,域根并不总是等于应用程序根。如果开发环境的结构与生产环境不匹配,还会使脚本变得脆弱。

相反,使用:

var arrowImages = { down: ['downarrowclass', '<%= Page.ResolveClientUrl("~/images/AppNavDownArrow.gif") %>', 23], right: ['rightarrowclass', '<%= Page.ResolveClientUrl("~/images/AppNavRightArrow.gif")  %>'] }

这将确保您的路径指向IIS中当前应用程序上下文的根目录,无论是域根目录还是虚拟目录。

如果您不想将脚本放在页面上并将其保存在.js文件中,请在母版页/布局/其他位置创建一个指向应用程序根的变量,然后在脚本文件中引用该变量:

<script type="text/javascript">
        var configuration = {
            applicationRoot: '<%= Page.ResolveClientUrl("~/") %>',
                currentPath: '<%= HttpContext.Current.Request.Path %>'
            }
</script>

在您的脚本文件中:

var arrowImages = { down: ['downarrowclass', configuration.applicationRoot +'/images/AppNavDownArrow.gif', 23], right: ['rightarrowclass', configuration.applicationRoot +'/images/AppNavRightArrow.gif'] }