〜/相当于JavaScript

在JavaScript中执行基于“根”的path引用的任何智能方式,就像我们在ASP.NET中所做的一样?

让你的页面生成一个标签,如下所示:

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

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

 function getHome(){ return document.getElementById("ApplicationRoot").href; } 

使用基本标签:

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

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

您也可以使用asp.netfunctionVirtualPathUtility

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

注意:我不会将path编码为JSONstring(转义引号,控制字符等)。 我不认为这是一个大问题(引号,例如不允许在URL中转义),但一个永远不知道…

我通常在js文件的顶部创build一个variables,并为其分配根path。 然后在引用文件时使用该variables。

 var rootPath = "/"; image.src = rootPath + "images/something.png"; 

〜/是应用程序根目录,而不是一个文字根目录,它将〜/表示为<YourAppVirtualDir>/

要在JavaScript中创build一个文字根目录,只需要/,即“/root.html”。 在JavaScript中无法获得应用程序级别的path。

你可以在ASPX文件中进行破解并将其输出到一个标签中,但是我会考虑这个问题的安全性。

可以改进Kamarey的答案来支持一个dynamic的基本path:

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

这将确保正确的根path,而不pipe部署configuration。

公平地说,这并没有回答原来的问题,但它消除了从JavaScript获取根path的大部分需求。 只需使用相对URL,无需使用斜杠作为前缀。

如果你仍然需要从javascript访问它,添加一个id属性,并使用document.getElementFromId()作为MiffTheFoxbuild议 – 但在基地标签。

另一个更简单,更通用的方法是采取以下措施:

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

并像这样使用Page.ResolveClientUrl:

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

那么无论哪个子目录总是会正确呈现url。

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

  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] + "/"; } 

在.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('~http://img.dovov.comprotest.jpg'); 

对于某些项目可能会稍微多一些,但是对于完整的应用程序来说,这是非常有用的。

ASP.NET MVC应用程序的解决scheme

这在VS中使用IIS和IIS Express时可以工作。

在所有脚本加载之前放置这个片段,以使根urlvariables为“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/"; 

Approotvariables将是以下任一种:

“/ YourWebsiteName /”< – IIS

要不就:

“/”< – IIS Express

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

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

并在所有相关的JavaScripturl,请确保启动时不使用斜线(/),否则将引用从根。

例如。 创build你喜欢的所有url

 "riskInfo": { url: "Contenthttp://img.dovov.comRiskInfo.png", id: "RI" }, 

要么

 $http.POST("Account/GetModelList", this, request, this.bindModelList); 

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

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

请参阅我的MVC应用程序中的checkbox单击事件

 @Html.CheckBoxFor(m=>Model.IsChecked, new {@onclick=@Url.Content("~/controller/action("+ @Model.Id + ", 1)"), @title="Select To Renew" })