2013-05-22 10 views
24

Come faccio a ottenere l'URL di base utilizzando JavaScript?Come ottenere URL di base di un'applicazione MVC utilizzando JavaScript

Ad esempio, Quando si naviga il mio sito da Visual Studio, e se il mio URL è http://localhost:20201/home/index, vorrei ottenere http://localhost:20201

Se ospito il mio sito su IIS, e se il mio nome della directory virtuale è MyApp e la URL è http://localhost/MyApp/home/index, vorrei ottenere http://localhost/MyApp

ho provato ad utilizzare location.protocol + location.hostname (e location.host), che funzionano bene quando navigo il mio sito tramite visual Studio, ma quando ho ospitarlo su IIS, ottengo http://localhost, il/MyApp viene troncato.

+0

Stai chiedendo Javascript, giusto? Che cosa ha a che fare con ASP.NET, con il framework MVC o IIS? – SimonSimCity

+0

perché il mio sito è stato creato utilizzando asp.net mvc ed è ospitato su IIS con un nome di directory virtuale –

risposta

27

Si dovrebbe evitare di fare come il rilevamento in JavaScript e invece passare il valore dal codice .NET. Sarete sempre il rischio di incorrere in problemi con gli URL come http://server/MyApp/MyApp/action dove non è possibile sapere quale è il nome di un controller, e che il percorso per l'applicazione.

Nel file Layout.cshtml (o ovunque ne avete bisogno) aggiungere il seguente codice:

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

è necessaria la parte new Uri() in modo che l'URL è sempre combinato correttamente (senza controllare manualmente se ogni parte inizia o termina con il simbolo /).

+0

MODIFICA: ok ha appena visto la tua risposta modificata –

+0

se hai bisogno di un percorso assoluto (incluso l'host e la porta, vedi la mia risposta aggiornata) –

+0

Provato questo su un'applicazione IIS ospitata, mostra 'http: // localhost' senza/MyApp. Non voglio hardcode la parte "/ MyApp" –

2

provare il codice qui sotto.

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

Grazie,

Siva

+1

È stato risolto solo su localhost? Se è distribuito, le persone accedono all'applicazione tramite l'indirizzo IP –

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

Questo mi dà ancora http: // localhost quando è ospitato su IIS –

+0

Bello e compatto e ha risolto il mio problema. Grazie! – JohnK

+0

In realtà questo è un po 'meglio: http://stackoverflow.com/a/11775016/1431728. – JohnK

2

Non credo che questo sia possibile in quanto non sa nulla circa la distribuzione del JavaScript (Client) (MyApp) e tratta come parte del percorso (proprio come/home/indice). Per aggirare il problema si potrebbe tentare di interpretare il pathinfo (location.pathname) in base al dominio o il porto.

ma si potrebbe impostare una variabile JavaScript in un ambito globale (o che cosa mai vi si addice) contenente il percorso (il percorso è generato dal server e inserito nella variabile).

Questo potrebbe sembrare qualcosa di simile nel tuo 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> 
0

È possibile impostare un URL di base nel tag tag della pagina. Tutti i link/hrefs useranno questo per chiamare hrefs relatieve.

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

Spiegazione:

  • Url.Content ("~ /") restituisce il percorso relativo (in questo caso MyApp sul server)
  • nuovo System.UriBuilder (Request. url.AbsoluteURI) crea un UriBuilder contenente porta e il protocollo informazioni
0

Credo che una soluzione pulita sarà come

Mettere l'URL di base nel _layout Html in questo modo

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

Context.Request.Url.GetLeftPart (UriPartial.Authority) ti darà in

locale http://localhost:20201 da IIS vi darà http://localhost

Url.Content ("~ /") nel locale sarà vuoto, ma in IIS vi darà il nome dell'applicazione, nel tuo caso MyApp

poi dal Js:

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

di quanto si può Usalo Come:

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

Problemi correlati