2013-05-22 33 views
24

Jak uzyskać podstawowy adres URL za pomocą javascript?Jak uzyskać podstawowy adres URL aplikacji MVC przy użyciu javascript

Np Kiedy przeglądać moją stronę z visual studio, a jeśli mój adres URL jest http://localhost:20201/home/index, chciałbym dostać http://localhost:20201

Gdybym gospodarzem mojej strony w IIS, a jeśli moja nazwa katalogu wirtualnego MojaApl i URL http://localhost/MyApp/home/index, chciałbym dostać http://localhost/MyApp

próbowałem za pomocą location.protocol + location.hostname (i location.host), pracują dobrze, kiedy mogę przeglądać moją stronę poprzez visual studio, ale kiedy udostępniać je na IIS, mam http://localhost, z/MyApp jest obcięte.

+0

Prosisz o JavaScript, prawda? Co to ma wspólnego z ASP.NET, jest to framework MVC lub IIS? – SimonSimCity

+0

ponieważ moja strona jest zbudowana przy użyciu asp.net mvc i jest hostowana na IIS z nazwą katalogu wirtualnego –

Odpowiedz

27

Należy unikać prowadzenia takiej wykrywanie w JavaScript i zamiast przekazać wartość od kodu .NET. Zawsze będziesz narażać się na problemy z adresami URL, takimi jak http://server/MyApp/MyApp/action, gdzie nie wiesz, jaka jest nazwa kontrolera i która ścieżka do aplikacji.

W pliku Layout.cshtml (lub gdziekolwiek jest to potrzebne) dodaj następujący kod:

<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() część konieczna jest więc, że adres URL jest zawsze połączone prawidłowo (bez ręcznego sprawdzania, czy każda część startów lub kończy się symbolem /).

+0

EDYTOWANIE: OK zobaczyłem twoją edytowaną odpowiedź –

+0

, jeśli potrzebujesz bezwzględnej ścieżki (w tym hosta i portu, zobacz moją zaktualizowaną odpowiedź). –

+0

Próbowałem tego na hostowanej aplikacji IIS, wyświetla ona 'http: // localhost' bez/MyApp. Nie chcę hardcode "/ MyApp" część –

2

Wypróbuj poniższy kod.

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

Dzięki

Siva

+1

Czy jest to poprawione tylko do localhost? Jeśli zostanie wdrożony, użytkownicy będą uzyskiwać dostęp do aplikacji za pośrednictwem adresu IP. –

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

To nadal daje mi http: // localhost, gdy jest hostowany na IIS –

+0

Miły i kompaktowy i rozwiązany mój problem. Dzięki! – JohnK

+0

Właściwie ten jest trochę lepszy: http://stackoverflow.com/a/11775016/1431728. – JohnK

2

nie sądzę, że jest to możliwe, ponieważ JavaScript (klient) nie wie nic o wdrożeniu wiedzieć (MojaApl) i traktuje jest częścią ścieżki informacji (podobnie jak/home/index). Aby obejść ten problem, można spróbować zinterpretować parametr pathinfo (location.pathname) zgodnie z domeną lub portem.

Ale możesz ustawić zmienną JavaScript w zasięgu globalnym (lub co ci pasuje) zawierającą ścieżkę (ścieżka jest generowana przez serwer i umieszczana w zmiennej).

Może to wyglądać mniej więcej tak, że w 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

Możesz ustawić podstawowy adres URL w tagu head swojej strony. Wszystkie linki/href będą używać tego do wywoływania hrefów relatieve.

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

Objaśnienie:

  • Url.Content ("~ /") zwraca ścieżkę względną (w tym przypadku MojaApl na serwerze)
  • nowy System.UriBuilder (żądanie. Url.AbsoluteUri) tworzy UriBuilder zawierający portu i protokołu informacje
0

myślę czyste rozwiązanie będzie jak

Umieszczenie bazowy URL w _layout HTML jak tak

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

Context.Request.Url.GetLeftPart (UriPartial.Authority) da ci w

lokalny http://localhost:20201 z IIS daje http://localhost

Url.Content („~ /”) w lokalnym będzie pusta, ale w IIS daje nazwę aplikacji, w przypadku MojaApl

następnie z Js:

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

niż można Używaj go odczuwalna:

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

Powiązane problemy