ASP.NETで~/
を使用するのと同じように、JavaScriptで「ルート」ベースのパスを参照するスマートな方法はありますか?
次のようなタグをページに生成させます。
<link rel="home" id="ApplicationRoot" href="http://www.example.com/appRoot/" />
次に、次のような値を抽出するJavaScriptの関数を用意します。
function getHome(){
return document.getElementById("ApplicationRoot").href;
}
base タグを使用:
<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 [〜#〜] -string(エスケープ引用符、制御文字など)へのパスはエンコードしません。これは大したことではないと思います(たとえば、引用符をURL内でエスケープ解除することはできません)。
通常、jsファイルの先頭に変数を作成し、それにルートパスを割り当てます。次に、ファイルを参照するときにその変数を使用します。
var rootPath = "/";
image.src = rootPath + "images/something.png";
カマレイの答えは動的なベースパスをサポートするように改善できます:
_<head>
<base href="http://<%= Request.Url.Authority + Request.ApplicationPath%>/" />
</head>
_
これにより、デプロイメント構成に関係なく、正しいルートパスが確保されます。
公平に言えば、これは元の質問には答えませんが、JavaScriptからルートパスを取得するためのほとんどの必要性を排除します。スラッシュを前に付けずに、どこでも相対URLを使用するだけです。
それでもJavaScriptからアクセスする必要がある場合は、id属性を追加し、MiffTheFoxの提案どおりにdocument.getElementFromId()
を使用しますが、ベースタグ上で使用します。
〜/はアプリケーションルートであり、リテラルルートではありません。〜/は<YourAppVirtualDir>/
を意味します。
JavaScriptでリテラルルートを実行するには、/、つまり "/root.html"だけです。 JavaScriptのようにアプリケーションレベルのパスを取得する方法はありません。
ASPXファイルでハッキングしてタグで出力することもできますが、そのセキュリティへの影響を考慮します。
もう少し簡単で普遍的なもう1つのオプションは、次の方法です。
<script src="/assets/js/bootstrap.min.js"><script>
次のようにPage.ResolveClientUrlを使用します。
<script src='<%=ResolveClientUrl("~/assets/js/bootstrap.min.js")%>'></script>
次に、URLが常に正しくレンダリングされるサブディレクトリに関係なく。
次の関数は、現在実行中のアプリケーションのルートを計算します。アプリケーションツリー内のどこかから呼び出されたときに、リソースの絶対的な場所を見つけるために使用します。
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] + "/";
}
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 {@[email protected]("~/controller/action("+ @Model.Id + ", 1)"),
@title="Select To Renew" })
ASP.net MVC Razorページの場合、<Head>
タグに以下のようなベースタグを作成します
<base href="http://@[email protected]" />
すべての相対JavaScript URLで、スラッシュ(/)なしで開始するようにしてください。そうしないと、ルートから参照されます。
例のために。のようなあなたのすべてのURLを作成する
"riskInfo": { url: "Content/images/RiskInfo.png", id: "RI" },
または
$http.POST("Account/GetModelList", this, request, this.bindModelList);