js扩展语句 〜/ javascript中的等价物




js扩展语句 (10)

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


Answer #1

如果你想在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" })

Answer #2

使用base标签:

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

...

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


Answer #3

〜/是应用程序根,而不是文字根,它<YourAppVirtualDir>/ 〜/表示<YourAppVirtualDir>/

要在JavaScript中创建一个字面根,它只是/,即“/root.html”。 在JavaScript中无法获得类似于应用程序级别的路径。

您可以在ASPX文件中破解它并将其输出到标记中,但我会考虑其安全含义。


Answer #4

另一个更简单,更普遍的选择是采取以下措施:

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

并使用Page.ResolveClientUrl,如下所示:

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

然后无论哪个子目录都将始终正确呈现网址。


Answer #5

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

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

Answer #6

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

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

Answer #7

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

<base href="http://@[email protected]" />

并且在所有相关的JavaScript URL中,确保没有斜杠(/),否则它将从根引用。

对于前者 创建你的所有网址

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

要么

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

Answer #8

在.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');

对于某些项目可能有点多,但对于完整的应用程序非常有用。


Answer #9

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

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

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

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

如果你仍然需要从javascript访问它,添加一个id属性并使用document.getElementFromId()作为MiffTheFox建议 - 但在base-tag上。


Answer #10

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

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

注意:我没有将路径编码为JSON -string(转义引号,控制字符等)。 我不认为这是一个大问题(例如,引号不允许在URL中转义),但是人们从不知道......





relative-path