2013-05-22 11 views
24

javascriptを使用してベースURLを取得するにはどうすればよいですか?JavaScriptを使用してMVCアプリケーションのベースURLを取得する方法

例えば、私は、Visual Studioから、私のサイトを参照して、私のURLがhttp://localhost:20201/home/indexであれば、私はIIS上で、私のサイトをホストしている場合、私はhttp://localhost:20201

を取得したい、と私の仮想ディレクトリ名がMyAppをしている場合URLはhttp://localhost/MyApp/home/indexである私は、Visual Studioを経由して、私のサイトを参照するとき、私は私がlocation.protocol + location.hostname(およびlocation.host)を使用してみましたhttp://localhost/MyApp

を取得したい、彼らが正常に動作しますが、私はIISにホストしたとき、私はhttp://localhostを取得し、/MyAppは切り捨てられます。

+0

あなたは正しい、Javascriptのために求めていますか?これはASP.NET、MVCフレームワークまたはIISと何が関係していますか? – SimonSimCity

+0

私のサイトはasp.net mvcを使用して構築されているため、仮想ディレクトリ名を使用してIIS上でホストされています –

答えて

27

あなたはJavaScriptでこのような検出を行うことを避ける、代わりに.NETコードから値を渡す必要があります。 http://server/MyApp/MyApp/actionのようなURLの問題に常にぶつかる危険があります。コントローラの名前とアプリケーションのパスを知ることはできません。あなたのLayout.cshtmlファイルで

(またはあなたがそれを必要な場所)次のコードを追加します。

<script type="text/javascript"> 
    window.applicationBaseUrl = @Html.Raw(HttpUtility.JavaScriptStringEncode(Url.Content("~/"), true)); 
    alert(window.applicationBaseUrl + "asd.html"); 

    // if you need to include host and port in the url, use this: 
    window.applicationBaseUrl = @Html.Raw(HttpUtility.JavaScriptStringEncode(
     new Uri(
        new Uri(this.Context.Request.Url.GetLeftPart(UriPartial.Authority)), 
        Url.Content("~/") 
       ).ToString(), true)); 
    alert(window.applicationBaseUrl + "asd.html"); 
</script> 

URLは、常に各パートが始まる場合は、手動でチェックせずに(正確に組み合わせられるようにnew Uri()部分が必要とされていますまたは/記号で終わります)。

+0

EDIT:編集した答えが –

+0

で、絶対パスが必要な場合(ホストとポートを含め、私の更新された回答を参照) –

+0

ホストされているIISアプリケーションでこれを試してみると、/ MyAppを除いた 'http:// localhost'と表示されます。私は "/ MyApp"の部分をハードコードしたくありません。 –

2

次のコードを試してください。

function getBaseURL() { 
    var url = location.href; // entire url including querystring - also: window.location.href; 
    var baseURL = url.substring(0, url.indexOf('/', 14)); 


    if (baseURL.indexOf('http://localhost') != -1) { 
     // Base Url for localhost 
     var url = location.href; // window.location.href; 
     var pathname = location.pathname; // window.location.pathname; 
     var index1 = url.indexOf(pathname); 
     var index2 = url.indexOf("/", index1 + 1); 
     var baseLocalUrl = url.substr(0, index2); 

     return baseLocalUrl + "/"; 
    } 
    else { 
     // Root Url for domain name 
     return baseURL + "/"; 
    } 

} 



document.write(getBaseURL()); 

のJavaScript(クライアント)が展開(MyAppの)および扱いについては何も知らないようおかげで、

シヴァ

+1

これはローカルホストのみに固定されていますか?デプロイされている場合、人々はIPアドレス –

2
var url = window.location.href.split('/'); 
var baseUrl = url[0] + '//' + url[2]; 
+0

でアプリケーションにアクセスします。これはIIS上でホストされるとhttp:// localhostになります –

+0

素敵でコンパクトで、私の問題を解決しました。ありがとう! – JohnK

+0

実際これは少し上手くいく:http://stackoverflow.com/a/11775016/1431728。 – JohnK

2

私はこれが可能であるとは思いませんそれはpathinfoの一部として(ちょうど/ home/indexのように)。この問題を回避するには、ドメインまたはポートに従ってpathinfo(location.pathname)を解釈することができます。

しかし、パスを含むグローバルスコープ(またはあなたに合ったもの)でJavaScript変数を設定できます(パスはサーバーによって生成され、変数に配置されます)。

これはあなたのhtml-頭にそのような何かを見ることができる:

<script type="text/javascript"> 
    var global_baseurl = '<insert server side code that gets the path depending on your server side programming language>'; 
</script> 
0

ページのヘッドタグでベースURLを設定できます。すべてのリンク/現実主義者はこれを使用して、関係を呼び出す。

@{ var baseHref = new System.UriBuilder(Request.Url.AbsoluteUri) { Path = Url.Content("~/") }; } 
<base href="@baseHref" /> 

説明:(サーバー上でこの場合はMyAppの)相対パスを返し

  • Url.Content( "〜/")
  • 新しいSystem.UriBuilder(要求。 URL。absoluteURIで)はポートとプロトコル情報
  • が含まれているUriBuilder
0

私はきれいな解決策はそう

<div id="BaseUrl" data-baseurl="@Context.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"></div>  

よう_layout HTMLでベースURLを置く

ようになると思うが作成されますContext.Request.Url.GetLeftPart(UriPartial.Authority)はあなたにあなたを与えます

は地元http://localhost:20201はIISから はあなたに( "〜/")ローカルでが空になりますが、IISであなたのケースでは、あなたのアプリの名前を与えるのMyApp

http://localhost

Url.Contentを与えますそして、Jsのから:

var baseUrl = $("#BaseUrl").data("baseurl"); 

あなたはそれを等を用いることができるより:

$.getJSON(baseUrl + "/Home/GetSomething", function (data) { 
     //Do something with the data 
}); 

https://msdn.microsoft.com/en-us/library/system.uri.getleftpart(v=vs.110).aspx http://api.jquery.com/data/

関連する問題