43

~/ASP.NETの場合と同じように、JavaScriptで「ルート」ベースのパス参照を行うスマートな方法はありますか?

4

12 に答える 12

46

ページに次のようなタグを生成させます。

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

次に、次のような値を抽出する JavaScript の関数を用意します。

function getHome(){
    return document.getElementById("ApplicationRoot").href;
}
于 2009-05-21T14:18:14.060 に答える
39

ベースタグを使用:

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

...

今後、このページで使用されるリンクは、javascript であるか html であるかに関係なく、「http://www.example.com/myapp/」であるベース タグに関連します。

于 2009-05-21T14:30:52.410 に答える
11

asp.net 機能を使用することもできますVirtualPathUtility

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

注意: JSON文字列へのパスをエンコードしません(エスケープ引用符、制御文字など)。これは大したことではないと思います (たとえば、URL で引用符をエスケープせずに使用することはできません)。

于 2009-05-21T15:16:24.050 に答える
8

私は通常、js ファイルの先頭に変数を作成し、ルート パスに割り当てます。次に、ファイルを参照するときにその変数を使用します。

var rootPath = "/";
image.src = rootPath + "images/something.png";
于 2009-05-21T14:19:57.893 に答える
6

~/ はアプリケーション ルートであり、文字通りのルートではありません。 ~/ を解釈して意味します<YourAppVirtualDir>/

JavaScript でリテラル ルートを実行するには、単に /、つまり "/root.html" です。JavaScript でそのようなアプリケーション レベルのパスを取得する方法はありません。

ASPXファイルでハッキングしてタグに出力することもできますが、そのセキュリティへの影響を検討します。

于 2009-05-21T14:18:12.157 に答える
6

Kamarey の回答は、動的ベース パスをサポートするように改善できます。

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

これにより、展開構成に関係なく、正しいルート パスが保証されます。

公平を期すために、これは元の質問には答えませんが、javascript からルート パスを取得するほとんどの必要性を排除します。スラッシュを前に付けずに、どこでも相対 URL を使用するだけです。

それでも javascript からアクセスする必要がある場合は、id 属性を追加し、document.getElementFromId()MiffTheFox が提案したように使用しますが、base-tag で使用します。

于 2011-09-26T16:04:45.683 に答える
5

少し単純でより普遍的な別のオプションは、次のようにすることです。

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

Page.ResolveClientUrl を次のように使用します。

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

次に、どのサブディレクトリに関係なく、URL は常に正しくレンダリングされます。

于 2013-09-09T17:45:53.283 に答える
1

ASP.NET MVC アプリケーションのソリューション

これは、VS で IIS と IIS Express を使用している場合に機能します。

ルート 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/" <-- IIS

あるいは単に:

"/" <-- IIS Express

于 2016-12-23T17:51:57.650 に答える
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');

一部のプロジェクトでは少し多めかもしれませんが、本格的なアプリケーションではうまく機能します。

于 2011-03-17T02:33:34.730 に答える
0

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" })
于 2014-07-31T16:05:47.047 に答える