web-dev-qa-db-de.com

So erhalten Sie die Basis-URL einer MVC-Anwendung mithilfe von Javascript

Wie erhalte ich die Basis-URL mit Javascript?

Zum Beispiel: Wenn ich meine Website von Visual Studio aus durchsuche und wenn meine URL http://localhost:20201/home/index lautet, möchte ich http://localhost:20201

Wenn ich meine Site auf IIS hoste und mein virtueller Verzeichnisname MyApp lautet und die URL http://localhost/MyApp/home/index lautet, würde ich http://localhost/MyApp erhalten möchten.

Ich habe versucht, location.protocol + location.hostname (und location.Host) zu verwenden. Sie funktionieren gut, wenn ich meine Website über Visual Studio browse. Wenn ich sie jedoch auf IIS hoste, erhalte ich http://localhost, die/MyApp wird abgeschnitten.

27
Null Reference

Sie sollten eine solche Erkennung in JavaScript vermeiden und stattdessen den Wert aus dem .NET-Code übergeben. Es besteht immer die Gefahr, dass Probleme mit URLs wie http://server/MyApp/MyApp/action auftreten, bei denen Sie nicht wissen können, wie der Name eines Controllers und welcher Pfad zur Anwendung ist.

Fügen Sie in Ihrer Layout.cshtml-Datei (oder wo immer Sie sie benötigen) den folgenden Code hinzu:

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

Der new Uri()-Teil wird benötigt, damit die URL immer korrekt kombiniert wird (ohne manuell zu prüfen, ob jeder Teil mit dem /-Symbol beginnt oder endet).

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

Ich glaube nicht, dass dies möglich ist, da JavaScript (der Client) nichts von Ihrer Bereitstellung (MyApp) weiß und es als Teil der Pfadinfo behandelt (genau wie/home/index). Als Problemumgehung können Sie versuchen, die Pfadinformationen (location.pathname) entsprechend der Domäne oder dem Port zu interpretieren.

Sie können jedoch eine JavaScript-Variable in einem globalen Bereich (oder was auch immer Ihnen passt) angeben, der den Pfad enthält (der Pfad wird vom Server generiert und in die Variable eingefügt).

Dies könnte in Ihrem html-Head so aussehen:

<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

Versuchen Sie den untenstehenden Code.

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

Vielen Dank,

Siva

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

Definieren Sie es in der Layoutdatei und hängen Sie base_url an. Das hat bei mir funktioniert.

0
Prince Prasad

Sie können im head -Tag Ihrer Seite eine Basis-URL festlegen. Alle Links/hrefs verwenden dies, um relatieve hrefs aufzurufen.

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

Erläuterung:

  • Url.Content ("~ /") gibt den relativen Pfad zurück (in diesem Fall MyApp auf dem Server)
  • new System.UriBuilder (Request.Url.AbsoluteUri) erstellt einen UriBuilder, der Port- und Protokollinformationen enthält
0
E. Mourits

Ich denke, dass eine saubere Lösung sein wird

Putting die Basis-URL in der _layout-Html-Datei

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

Context.Request.Url.GetLeftPart (UriPartial.Authority) gibt Sie ein

local http: // localhost: 20201 von IIS gibt Ihnen http: // localhost

Url.Content ("~ /") im Local ist leer, aber in IIS erhalten Sie den App-Namen, in Ihrem Fall MyApp

Dann vom Js:

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

Dann können Sie verwenden Sie es wie:

$.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