2013-05-22 2 views
24

Wie bekomme ich die Basis-URL mit Javascript?So erhalten Sie die Basis-URL einer MVC-Anwendung mit JavaScript

zB wenn ich meine Website von Visual Studio zu finden, und wenn meine URL http://localhost:20201/home/index ist, würde ich http://localhost:20201

zu bekommen Wenn ich auf IIS meine Website hosten, und wenn mein Name des virtuellen Verzeichnisses MeineAnw ist und die URL ist http://localhost/MyApp/home/index, würde ich http://localhost/MyApp

bekommen möchte ich versucht, mit location.protocol + location.hostname (und location.host), sie gut funktionieren, wenn ich meine Seite über Visual Studio zu sehen, aber wenn ich es auf IIS hosten, erhalte ich http://localhost, die/MyApp ist abgeschnitten.

+0

Sie fragen für Javascript, nicht wahr? Was hat das mit ASP.NET zu tun, es ist MVC Framework oder IIS? – SimonSimCity

+0

, da meine Site mit asp.net mvc erstellt wurde und auf IIS mit einem virtuellen Verzeichnisnamen gehostet wird –

Antwort

27

Sie sollten tun, eine solche Erfassung in JavaScript vermeiden und stattdessen den Wert aus dem .NET-Code übergeben. Sie werden immer riskieren, auf Probleme mit URLs wie http://server/MyApp/MyApp/action zu stoßen, wo Sie nicht wissen können, welches der Name eines Controllers und welcher Pfad zu der Anwendung ist.

In Ihrer Layout.cshtml-Datei (oder wo auch immer Sie benötigen) fügen Sie den folgenden Code ein:

<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 benötigt wird, so dass die URL immer richtig kombiniert wird (ohne wenn jeder Teil beginnt manuelle Überprüfung oder endet mit / Symbol).

+0

EDIT: ok gerade sah Ihre bearbeitete Antwort –

+0

, wenn Sie einen absoluten Pfad benötigen (einschließlich der Host und Port, siehe meine aktualisierte Antwort) –

+0

Versucht dies auf gehosteten IIS-Anwendung, es zeigt 'http: // localhost' ohne/MyApp. Ich möchte nicht den "/ MyApp" -Teil fest codieren –

2

Versuchen Sie den folgenden 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()); 

Danke,

Siva

+1

Ist dies nur auf localhost festgelegt? Wenn es bereitgestellt wird, werden die Menschen auf die Anwendung über die IP-Adresse zugreifen –

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

Dies gibt mir immer noch http: // localhost, wenn auf IIS gehostet –

+0

Schön und kompakt und löste mein Problem. Vielen Dank! – JohnK

+0

Eigentlich ist dieses ein bisschen besser: http://stackoverflow.com/a/11775016/1431728. – JohnK

2

Ich glaube nicht, dass dies möglich ist, da die JavaScript (der Client) etwas über Ihre Bereitstellung (MyApp) und behandelt nicht weiß, Es ist Teil des pathinfo (genau wie/home/index). Als Workaround könnten Sie versuchen, die Pfadinfo (location.pathname) entsprechend der Domäne oder dem Port zu interpretieren.

Sie könnten jedoch eine JavaScript-Variable in einem globalen Bereich (oder was auch immer Ihnen passt) mit dem Pfad (der Pfad wird vom Server generiert und in die Variable eingefügt) festlegen.

so etwas in Ihrem HTML-Head aussehen Dies könnte:

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

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

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

Erläuterung:

  • Url.Content ("~ /") den relativen Pfad zurück (in diesem Fall MeineAnw auf dem Server)
  • neuen System.UriBuilder (Request. Url.AbsoluteURI) schafft eine UriBuilder, die Port- und Protokollinformationen enthält
0

ich eine saubere Lösung denken sein wird wie

Putting die Basis-URL in der _layout Html wie so

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

Context.Request.Url.GetLeftPart (UriPartial.Authority) gibt Ihnen in

lokalen http://localhost:20201 von IIS geben Ihnen http://localhost

Url.Content ("~ /") im lokalen leer sein wird, aber in IIS erhalten Sie die App-Namen geben, in Ihrem Fall MeineAnw

dann aus dem Js:

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

als Sie Verwenden Sie es Like:

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

Verwandte Themen