2013-05-22 34 views
24

Làm cách nào để nhận URL cơ sở bằng javascript?Cách lấy URL cơ sở của ứng dụng MVC bằng cách sử dụng javascript

Ví dụ, Khi tôi duyệt trang web của tôi từ visual studio, và nếu URL của tôi là http://localhost:20201/home/index, tôi muốn để có được http://localhost:20201

Nếu tôi lưu trữ trang web của tôi trên IIS, và nếu tên thư mục ảo của tôi là MyApp và URL là http://localhost/MyApp/home/index, tôi muốn để có được http://localhost/MyApp

tôi đã cố gắng sử dụng location.protocol + location.hostname (và location.host), họ làm việc tốt khi tôi duyệt trang web của tôi qua visual studio, nhưng khi tôi lưu trữ nó trên IIS, tôi nhận được http://localhost, các/MyApp bị cắt bớt.

+0

Bạn đang yêu cầu cho Javascript, phải không? Điều này phải làm gì với ASP.NET, đó là khung MVC hay IIS? – SimonSimCity

+0

bởi vì trang web của tôi được xây dựng bằng cách sử dụng asp.net mvc, và nó được lưu trữ trên IIS với tên thư mục ảo –

Trả lời

27

Bạn nên tránh làm phát hiện như vậy trong JavaScript và thay vào đó vượt qua giá trị từ mã NET. Bạn sẽ luôn có nguy cơ gặp sự cố với các url như http://server/MyApp/MyApp/action nơi bạn không thể biết đó là tên của bộ điều khiển và đường dẫn đến ứng dụng.

Trong file Layout.cshtml của bạn (hoặc bất cứ nơi nào bạn cần nó) thêm đoạn mã sau:

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

Phần new Uri() là cần thiết để các URL luôn kết hợp một cách chính xác (mà không kiểm tra bằng tay nếu từng phần bắt đầu hoặc kết thúc bằng biểu tượng /).

+0

EDIT: ok chỉ thấy câu trả lời đã chỉnh sửa –

+0

nếu bạn cần đường dẫn tuyệt đối (bao gồm máy chủ và cổng, xem câu trả lời đã cập nhật của tôi) –

+0

Đã thử trên ứng dụng IIS được lưu trữ này, nó hiển thị 'http: // localhost' không có/MyApp. Tôi không muốn hardcode "/ MyApp" phần –

2

Hãy thử mã bên dưới.

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

Cảm ơn,

Siva

+1

Đây có phải là cố định chỉ cho localhost không? Nếu nó được triển khai, mọi người sẽ truy cập ứng dụng qua địa chỉ IP –

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

Điều này vẫn mang lại cho tôi http: // localhost khi được lưu trữ trên IIS –

+0

Đẹp và nhỏ gọn và giải quyết được vấn đề của tôi. Cảm ơn! – JohnK

+0

Thực ra cái này tốt hơn một chút: http://stackoverflow.com/a/11775016/1431728. – JohnK

2

Tôi không nghĩ rằng đây có thể là JavaScript (Client) không biết gì về việc triển khai của bạn (MyApp) và xử lý nó như là một phần của pathinfo (giống như/home/index). Để khắc phục sự cố, bạn có thể cố gắng diễn giải đường dẫn (location.pathname) theo tên miền hoặc cổng.

Nhưng bạn có thể đặt biến JavaScript trong phạm vi toàn cầu (hoặc điều gì phù hợp với bạn) chứa đường dẫn (đường dẫn được tạo bởi máy chủ và được đặt vào biến).

Điều này có thể trông giống như thế trong html-Head của bạn:

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

Bạn có thể đặt url cơ sở trong thẻ đầu của trang của bạn. Tất cả các liên kết/href sẽ sử dụng điều này để gọi các relatieve href.

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

Giải thích:

  • Url.Content ("~ /") trả về đường dẫn tương đối (trong trường hợp này MyApp trên máy chủ)
  • mới System.UriBuilder (Request. Url.AbsoluteUri) tạo ra một UriBuilder có chứa cổng và giao thức thông tin
0

Tôi nghĩ rằng một giải pháp sạch sẽ như thế nào

Đưa URL cơ sở trong _layout Html như vậy

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

Context.Request.Url.GetLeftPart (UriPartial.Authority) sẽ cung cấp cho bạn trong

địa phương http://localhost:20201 từ IIS sẽ cung cấp cho bạn http://localhost

Url.Content ("~ /") ở các địa phương sẽ được bỏ trống nhưng trong IIS sẽ cung cấp cho bạn tên ứng dụng, trong trường hợp của bạn MyApp

sau đó từ Js:

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

hơn bạn có thể Sử dụng nó Giống như:

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

Các vấn đề liên quan