web-dev-qa-db-ja.com

JavaScriptを使用してMVCアプリケーションのベースURLを取得する方法

JavaScriptを使用してベースURLを取得するにはどうすればよいですか?

たとえば、Visual Studioからサイトを閲覧し、URLがhttp://localhost:20201/home/indexの場合、http://localhost:20201を取得したい

IISでサイトをホストし、仮想ディレクトリ名がMyAppでURLがhttp://localhost/MyApp/home/indexである場合、http://localhost/MyAppを取得したい

location.protocol + location.hostname(およびlocation.Host)を使用してみましたが、Visual Studioでサイトを閲覧すると正常に機能しますが、IISでホストするとhttp://localhostを取得します、/ MyAppは切り捨てられます。

28
Null Reference

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>
_

new Uri()部分は、URLが常に正しく結合されるために必要です(各部分が_/_記号で始まるか終わるかを手動で確認することなく)。

33
Knaģis
var url = window.location.href.split('/');
var baseUrl = url[0] + '//' + url[2];
2
vijay

JavaScript(クライアント)は展開(MyApp)について何も知らず、pathinfoの一部として(/ home/indexのように)処理するため、これは可能だとは思いません。回避策として、ドメインまたはポートに従ってpathinfo(location.pathname)の解釈を試みることができます。

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

これは、html-Headで次のようになります。

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

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

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

ありがとう、

シヴァ

1
SivaRajini
var base_url = "@Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"

レイアウトファイルで定義し、base_urlを追加します。これは私のために働いた。

0
Prince Prasad

ページのheadタグでベースURLを設定できます。すべてのリンク/ hrefは、これを使用してrelatieve hrefを呼び出します。

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

説明:

  • Url.Content( "〜/")は相対パスを返します(この場合、サーバー上のMyApp)
  • new System.UriBuilder(Request.Url.AbsoluteUri)は、ポートおよびプロトコル情報を含むUriBuilderを作成します
0
E. Mourits

きれいな解決策は次のようになると思います

Putting_layout Htmlのように

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

Context.Request.Url.GetLeftPart(UriPartial.Authority)は、

local http:// localhost:20201 from IISを指定すると http:// localhost

Url.Content( "〜/")ローカルでは空になりますが、IISでアプリ名、MyAppになります

次に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).aspxhttp://api.jquery.com/data /

0
HB MAAM