43

在 JavaScript 中进行基于“根”的路径引用的任何智能方式,就像我们~/在 ASP.NET 中的方式一样?

4

12 回答 12

46

让您的页面生成带有以下内容的标签:

<link rel="home" id="ApplicationRoot" href="http://www.example.com/appRoot/" />

然后,在 JavaScript 中有一个函数来提取值,例如:

function getHome(){
    return document.getElementById("ApplicationRoot").href;
}
于 2009-05-21T14:18:14.060 回答
39

使用基本标签:

<head>
   <base href="http://www.example.com/myapp/" />
</head>

...

从现在开始,此页面上使用的任何链接,无论是 javascript 还是 html,都将与基本标记相关,即“ http://www.example.com/myapp/ ”。

于 2009-05-21T14:30:52.410 回答
11

您还可以使用 asp.net 功能VirtualPathUtility

<script>
var basePath = '<%=VirtualPathUtility.ToAbsolutePath("~/")%>';
</script>

注意:我没有将路径编码为JSON字符串(转义引号、控制字符等)。我认为这没什么大不了的(例如,引号不允许在 URL 中转义),但永远不知道......

于 2009-05-21T15:16:24.050 回答
8

我通常在 js 文件的顶部创建一个变量,并为其分配根路径。然后我在引用文件时使用该变量。

var rootPath = "/";
image.src = rootPath + "images/something.png";
于 2009-05-21T14:19:57.893 回答
6

~/ 是应用程序根而不是字面根,它解释 ~/ 表示<YourAppVirtualDir>/

要在 JavaScript 中做一个字面根,它只是 /,即“/root.html”。没有办法在 JavaScript 中获得这样的应用程序级路径。

您可以在 ASPX 文件中破解它并将其输出到标签中,但我会考虑这样做的安全隐患。

于 2009-05-21T14:18:12.157 回答
6

可以改进 Kamarey 的答案以支持动态基本路径:

<head>    
      <base href="http://<%= Request.Url.Authority + Request.ApplicationPath%>/" />    
</head> 

无论部署配置如何,这都将确保正确的根路径。

公平地说,这并没有回答最初的问题,但它消除了从 javascript 获取根路径的大多数需求。只需在任何地方使用相对 URL,而不用斜杠作为前缀。

如果您仍需要从 javascript 访问它,请添加一个 id 属性并document.getElementFromId()按照 MiffTheFox 的建议使用 - 但在基本标签上。

于 2011-09-26T16:04:45.683 回答
5

另一个更简单、更通用的选择是采用以下方法:

<script src="/assets/js/bootstrap.min.js"><script>

并像这样使用 Page.ResolveClientUrl:

<script src='<%=ResolveClientUrl("~/assets/js/bootstrap.min.js")%>'></script>

那么无论在哪个子目录中,url 都将始终正确呈现。

于 2013-09-09T17:45:53.283 回答
2

以下函数将计算当前正在运行的应用程序的根。当从应用程序树的某个深处调用时,我使用它来定位资源的绝对位置。

    function AppRoot() {
        //
        // Returns the root of the currently running ASP application.
        // in the form: "http://localhost/TRMS40/"
        //
        //   origin: "http://localhost"
        // pathname: "/TRMS40/Test/Test%20EMA.aspx"
        //
        // usage:
        //           window.open( AppRoot() + "CertPlan_Editor.aspx?ID=" + ID);
        //

        var z = window.location.pathname.split('/');

        return window.location.origin + "/" + z[1] + "/";
    }
于 2014-10-11T00:14:31.500 回答
1

在 .NET 基本页面的 PreRender 中,添加以下内容:

 protected override void
 OnPreRender(EventArgs e) {
     base.OnPreRender(e);

     if (Page.Header != null)
     {
         //USED TO RESOLVE URL IN JAVASCRIPT
         string baseUrl = String.Format("var baseUrl='{0}';\n", 
           HttpContext.Current.Request.ApplicationPath);
         Page.Header.Controls.Add(new LiteralControl(String.Format(Consts.JS_TAG,
           baseUrl)));
     }
}

然后在您的全局 JavaScript 函数中,添加以下内容:

 function resolveUrl(url) {
   if (url.indexOf("~/") == 0) {
     url = baseUrl + url.substring(2);
   }
 return url; }

现在你可以像这样使用它:

 document.getElementById('someimage').src = resolveUrl('~/images/protest.jpg');

对于某些项目来说可能有点多,但对于成熟的应用程序来说非常有用。

于 2011-03-17T02:33:34.730 回答
1

ASP.NET MVC 应用解决方案

这在 VS 中使用 IIS 和 IIS Express 时有效。

将此代码段放在所有脚本加载之前,以便让根 url 变量“approot”。

在脚本中为您服务:

<script>
        var approot = "@Url.Content("~")";
</script>

 --> other scripts go here or somewhere later in the page.

然后在您的脚本或页面脚本中使用它。例子:

var sound_root_path = approot + "sound/";
var img_root_path = approot + "img/";

approot 变量将是:

"/YourWebsiteName/" <-- IIS

要不就:

"/" <-- IIS Express

于 2016-12-23T17:51:57.650 回答
0

对于 ASP.net MVC Razor 页面,在标签中创建如下所示的基本<Head>标签

<base href="http://@Request.Url.Authority@Request.ApplicationPath" />

并且在您所有的相关 javascript URL 中,确保以不带斜杠 (/) 的方式开始,否则它将从根目录引用。

例如。创建您所有的网址,例如

"riskInfo": { url: "Content/images/RiskInfo.png", id: "RI" },

或者

$http.POST("Account/GetModelList", this, request, this.bindModelList);
于 2013-04-13T20:27:35.927 回答
0

如果你想在 HTML 中使用它仍然可以使用~,看这个

 href = @Url.Content("~/controllername/actionName")

查看我的 MVC 应用程序中的复选框单击事件

@Html.CheckBoxFor(m=>Model.IsChecked,  
   new {@onclick=@Url.Content("~/controller/action("+ @Model.Id + ", 1)"), 
   @title="Select To Renew" })
于 2014-07-31T16:05:47.047 回答