~/ASP.NETの場合と同じように、JavaScriptで「ルート」ベースのパス参照を行うスマートな方法はありますか?
12 に答える
ページに次のようなタグを生成させます。
<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.net 機能を使用することもできますVirtualPathUtility。
<script>
var basePath = '<%=VirtualPathUtility.ToAbsolutePath("~/")%>';
</script>
注意: JSON文字列へのパスをエンコードしません(エスケープ引用符、制御文字など)。これは大したことではないと思います (たとえば、URL で引用符をエスケープせずに使用することはできません)。
私は通常、js ファイルの先頭に変数を作成し、ルート パスに割り当てます。次に、ファイルを参照するときにその変数を使用します。
var rootPath = "/";
image.src = rootPath + "images/something.png";
~/ はアプリケーション ルートであり、文字通りのルートではありません。 ~/ を解釈して意味します<YourAppVirtualDir>/
JavaScript でリテラル ルートを実行するには、単に /、つまり "/root.html" です。JavaScript でそのようなアプリケーション レベルのパスを取得する方法はありません。
ASPXファイルでハッキングしてタグに出力することもできますが、そのセキュリティへの影響を検討します。
Kamarey の回答は、動的ベース パスをサポートするように改善できます。
<head>
<base href="http://<%= Request.Url.Authority + Request.ApplicationPath%>/" />
</head>
これにより、展開構成に関係なく、正しいルート パスが保証されます。
公平を期すために、これは元の質問には答えませんが、javascript からルート パスを取得するほとんどの必要性を排除します。スラッシュを前に付けずに、どこでも相対 URL を使用するだけです。
それでも javascript からアクセスする必要がある場合は、id 属性を追加し、document.getElementFromId()MiffTheFox が提案したように使用しますが、base-tag で使用します。
少し単純でより普遍的な別のオプションは、次のようにすることです。
<script src="/assets/js/bootstrap.min.js"><script>
Page.ResolveClientUrl を次のように使用します。
<script src='<%=ResolveClientUrl("~/assets/js/bootstrap.min.js")%>'></script>
次に、どのサブディレクトリに関係なく、URL は常に正しくレンダリングされます。
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
.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');
一部のプロジェクトでは少し多めかもしれませんが、本格的なアプリケーションではうまく機能します。
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" })