在JavaScript中执行基于“root”的路径引用的任何智能方法,就像我们在ASP.NET中~/
的方式一样?
答案 0 :(得分:46)
让您的网页生成类似以下内容的标记:
<link rel="home" id="ApplicationRoot" href="http://www.example.com/appRoot/" />
然后,在JavaScript中使用一个提取值的函数,例如:
function getHome(){
return document.getElementById("ApplicationRoot").href;
}
答案 1 :(得分:38)
使用base标记:
<head>
<base href="http://www.example.com/myapp/" />
</head>
...
从现在开始,无论是javascript还是html,此页面上的任何链接都将使用相对于基本标记,即“http://www.example.com/myapp/”。
答案 2 :(得分:10)
您还可以使用asp.net功能VirtualPathUtility
:
<script>
var basePath = '<%=VirtualPathUtility.ToAbsolutePath("~/")%>';
</script>
注意:我没有将路径编码为JSON - 字符串(转义引号,控制字符等)。我不认为这是一个大问题(例如,引号不允许在URL中转义),但是人们永远不知道......
答案 3 :(得分:8)
我通常在js文件的顶部创建一个变量并为其分配根路径。然后我在引用文件时使用该变量。
var rootPath = "/";
image.src = rootPath + "images/something.png";
答案 4 :(得分:6)
〜/是应用程序根目录而不是文字根,它相互关联〜/表示<YourAppVirtualDir>/
在JavaScript中做一个字面根只是/,即“/root.html”。没有办法在JavaScript中获得类似的应用程序级别路径。
您可以在ASPX文件中破解它并将其输出到标记中,但我会考虑其安全含义。
答案 5 :(得分:6)
Kamarey的答案可以改进以支持动态基本路径:
<head>
<base href="http://<%= Request.Url.Authority + Request.ApplicationPath%>/" />
</head>
无论部署配置如何,这都将确保正确的根路径。
公平地说,这不能回答原始问题,但它消除了从javascript获取根路径的大多数需求。只需在任何地方使用相对URL,不要使用斜杠作为前缀。
如果你仍然需要从javascript访问它,添加一个id属性并使用document.getElementFromId()
作为MiffTheFox建议 - 但是在base-tag上。
答案 6 :(得分:5)
另一个更简单,更普遍的选择是采取以下措施:
<script src="/assets/js/bootstrap.min.js"><script>
并像这样使用Page.ResolveClientUrl:
<script src='<%=ResolveClientUrl("~/assets/js/bootstrap.min.js")%>'></script>
然后无论哪个子目录都将始终正确呈现网址。
答案 7 :(得分: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] + "/";
}
答案 8 :(得分: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');
对于某些项目可能有点多,但对于完全成熟的应用程序非常有用。
答案 9 :(得分:1)
ASP.NET MVC应用程序的解决方案
在VS中使用IIS和IIS Express时也可以。
在加载所有脚本之前放置此代码段,以便拥有根网址变量&#34; approot&#34;。
在您的服务中使用脚本:
<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变量将是:
&#34; / YourWebsiteName /&#34; &lt; - IIS
或只是:
&#34; /&#34; &lt; - IIS Express
答案 10 :(得分:0)
对于ASP.net MVC Razor页面,在<Head>
标记中创建如下所示的基本标记
<base href="http://@Request.Url.Authority@Request.ApplicationPath" />
并且在所有相关的javascript网址中,请确保以斜杠(/)开头,否则它将从根引用。
对于前。创建所有的网址,如
"riskInfo": { url: "Content/images/RiskInfo.png", id: "RI" },
或
$http.POST("Account/GetModelList", this, request, this.bindModelList);
答案 11 :(得分:0)
如果你想在HTML中使用它仍然可以使用〜,请参阅
href = @Url.Content("~/controllername/actionName")
请参阅我的MVC应用程序中的复选框click事件
@Html.CheckBoxFor(m=>Model.IsChecked,
new {@onclick=@Url.Content("~/controller/action("+ @Model.Id + ", 1)"),
@title="Select To Renew" })