〜/相当于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" })