【问题标题】:~/ equivalent in javascript~/ 等价于 javascript
【发布时间】:2023-04-11 05:01:01
【问题描述】:

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

【问题讨论】:

  • 你构建路径是为了什么? XmlHttpRequest?
  • @Gumbo:表示应用根目录,与asp.net有关。

标签: javascript asp.net web-applications relative-path


【解决方案1】:

ASP.NET MVC 应用程序解决方案

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

在所有脚本加载之前放置这个 sn-p,以便让根 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/"

或者只是:

"/"

【讨论】:

    【解决方案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] + "/";
        }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        并像这样使用 Page.ResolveClientUrl:

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

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

        【讨论】:

          【解决方案5】:

          对于 ASP.net MVC Razor 页面,在 &lt;Head&gt; 标记中创建一个基本标记,如下所示

          <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);
          

          【讨论】:

            【解决方案6】:

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

            对于某些项目来说可能有点多,但对于成熟的应用程序来说效果很好。

            【讨论】:

              【解决方案7】:

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

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

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

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

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

              【讨论】:

              • 我喜欢这个解决方案,但是我必须稍微调整一下才能让它在 Razor 中工作。 &lt;base href="http://@((Request.Url.Authority + Request.ApplicationPath).TrimEnd('/'))/" /&gt; ApplicationPath 有时以“/”结尾,有时不是,所以我添加了 TrimEnd('/') 调用。
              【解决方案8】:

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

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

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

              【讨论】:

              • 方法应该是:VirtualPathUtility.ToAbsolute("~/") 这是最好的方法,它提供了更大的灵活性,因为它可以部署为虚拟目录或根网络应用程序
              【解决方案9】:

              使用base标签:

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

              ...

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

              【讨论】:

              • 真的很有用。不知道这个标签。
              • 感谢您的回答。这对我帮助很大。
              • 太棒了,从来不知道这个标签。有关对此的动态增强,请参阅下面的 Nilzor 的答案。非常适合具有不同 url 的 dev 和 qa 环境之间的兼容性。
              • 应该注意的是,ASP.NET Web 窗体会为 CSS 链接标签之类的东西生成相对路径。像这样应用基本标签会弄乱这些相对路径。我更喜欢上面的链接方法而不是 JS 变量,因为当 F5 BIGIP 等网络基础设施设备重写 URL 时,有时会忽略 JS 变量。 href 属性显然是此类设备可以轻松识别的 URL。
              • 请注意,使用基本标签也可能有问题,请参阅 [stackoverflow.com/questions/1889076/…
              【解决方案10】:

              让您的页面生成一个类似以下内容的标签:

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

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

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

              【讨论】:

              • 修改了这个例子稍微使它不那么模棱两可
              • 注意:要生成标签,这样的代码应该会有所帮助: string urlPath = HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.ApplicationPath;
              • 如果您打算使用服务器端代码来生成值,为什么需要将它放在 元素中并使用 getElementById 检索它?只需执行
              • 将它放在 标记中可以让您将 JS 与您的标记分开。当然,Web 表单无论如何都会在您的标记中投入相当多的 JS,因此在那种环境中变量可能会更容易。
              • 提供了一个不错的相对路径前缀。请注意,head 标记必须具有 runat="server" 属性。
              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

                ~/ 是应用程序根而不是字面根,它解释 ~/ 表示 &lt;YourAppVirtualDir&gt;/

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

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

                【讨论】:

                • 虽然您对 ~/ 的定义是正确的,但说无法通过 javascript 获得它有点失败,只是需要一点想象力。
                • 好吧,一个完全是服务器端,另一个不是,尽管我说你 can 把它带到客户端,但我个人不会:)
                • 暴露您的应用程序根目录会带来哪些安全隐患?攻击者已经知道应用程序根是页面 URL 的嵌套级别之一,不是吗?
                • 是的,我一直在考虑 ~/ 最终会扩展,但那不会发生。
                猜你喜欢
                • 1970-01-01
                • 2010-10-11
                • 2014-01-04
                • 2011-05-29
                • 2011-07-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多