2009-05-28 40 views
16

Tôi đang tải lên một số nội dung thông qua jQuery.load ('/ Business/Tags'), hoạt động tốt khi sử dụng máy chủ web cục bộ của tôi. Nhưng khi sử dụng iis, điều này không giải quyết chính xác. Tôi đã thấy một vài cách khác nhau để giải quyết vấn đề này như ResolveUrl. Cách tốt nhất để xử lý các url giải quyết trong javascript của bạn là gì?ASP.NET MVC giải quyết các url trong javascript

Trả lời

18

Tôi đã gặp sự cố chính xác này với JavaScript của mình. Vì JavaScript của tôi cũng nằm trong một tệp riêng biệt được bao gồm trong Trang cái của tôi, tôi không thể sử dụng ResolveUrl trong trường hợp của mình.

Đây là cách tôi giải quyết trong trường hợp của tôi. Tôi đã bao gồm mã JavaScript sau trong thẻ đầu của tôi trong Trang cái của tôi ở trên cùng:

<script type="text/javascript"> 
    var baseUrl = "<%= Request.Url.GetLeftPart(UriPartial.Authority) %>"; 
</script> 

Tôi đang đặt một biến toàn cầu có thể truy cập được vào tất cả các tệp JavaScript của tôi được gọi là baseUrl.

Mã của bạn sau đó sẽ trở thành:

jQuery.load(baseUrl + '/Business/Tags'); 
+0

Tôi đã thử phương pháp này nhưng tôi không nhận được khá những gì tôi cần nhưng tôi nghĩ rằng tôi có thể làm việc với nó.Tôi nhận được một chuỗi như thế này "http: // mtsengv003 /" nhưng tôi cần một cái như thế này "http: // mtsengv003/MVC /" Cảm ơn –

+5

Tôi nghĩ rằng nó tốt hơn để sử dụng: var baseUrl = "<% = Yêu cầu .Url.GetLeftPart (UriPartial.Authority) + Request.ApplicationPath.TrimEnd ('/')%> "; –

+0

@ eu-ge-ne: Cảm ơn bạn đã chỉ ra điều đó. Ký ức của tôi không phải là những gì nó từng là. Mã của bạn là hoàn hảo. –

5

Đối với tôi, tôi đang sử dụng những người giúp đỡ Url.Action/Url.RouteUrl với JavaScript/jQuery nơi người ta có thể:

$.load('<%= Url.Action("Tags", "Business") %>') 

hoặc

$.load('<%= Url.RouteUrl("BusinessTagsRoute") %>') 

Trong các trường hợp khác tôi đang sử dụng trình trợ giúp ResolveUrl (từ MVCContrib hoặc bạn có thể tự viết):

$.load('<%= Url.ResolveUrl("~/Business/Tags") %>') 

CẬP NHẬT:

Nó cũng có thể để tạo ra bộ điều khiển đặc biệt cho JavaScript của bạn/jQuery với hành động, trở về PartialViews với JavaScript:

public ActionResult YourJavaScript() 
{ 
    Response.ContentType = "application/x-javascript"; 
    return PartialView("YourJavaScript"); 
} 

Sau đó, trong bạn YourJavaScript.ascx bạn có thể sử dụng mã JavaScript/jQuery với các thẻ máy chủ WebForms. Tôi vẫn khuyên bạn không nên sử dụng các url được mã hóa hầu hết trong jQuery/AJAX

+1

Nếu bạn đặt tất cả JavaScript của mình vào một tệp riêng và sau đó tham chiếu tệp này bằng cách sử dụng Url.Content trong trang Chính của bạn, Url.ResolveUrl sẽ không hoạt động trong JavaScript của bạn. Ai đó hãy sửa tôi nếu tôi sai về điều này. –

1

Tôi vẫn khuyên bạn nên sử dụng thẻ cơ sở href trong trang Chính của bạn. do đó mọi hình ảnh hoặc cuộc gọi javascript sẽ giải quyết từ url này. Điều này sẽ cho phép bạn đặt các hàm/cuộc gọi javascript của bạn vào một tệp js bên ngoài.

 
<html> 
    <head> 
     <base href="http://www.mysite.com/virtual_dir1/"> 
     <script src="location_of_js_file"> 

Nhớ kết thúc '/' trong href cơ sở.

Ngoài ra, hãy xóa '/' hàng đầu và bất cứ khi nào bạn làm jQuery.load ('Doanh nghiệp/Thẻ'), nó sẽ thực sự xuất phát từ http://www.mysite.com/virtual_dir1/Business/Tags.

+0

Tôi thực sự thực sự thích cách tiếp cận này. Vì vậy, sạch sẽ và đòi hỏi rất ít nỗ lực. Cảm ơn – lomaxx

+0

Điều này chắc chắn là một cách tiếp cận thực dụng cho vấn đề này, nhưng sử dụng ['base'] (http://www.w3.org/TR/REC-html40/struct/links.html#h-12.4) theo cách này là sai. Chỉ nên sử dụng HREF cơ sở để giải quyết URI tương đối với trang hiện tại bạn đang truy cập. Bằng cách đặt 'base' theo cách này ** tất cả ** URI tương đối trên trang này sẽ trỏ tới' http: // www.mysite.com/virtual_dir1/'. – ahsteele

2

Một vài cách chúng ta làm điều này trong các ứng dụng của chúng tôi:

var applicationPath = '<%= Url.Content("~/") %>'; 

HOẶC

var applicationPath = '<%= Request.Url.Scheme %>://<%= Request.Url.Host %><%= Request.ApplicationPath %>/'; 

Sau đó chúng tôi sử dụng applicationPath như địa chỉ cơ sở cho tất cả các cuộc gọi ajax của chúng tôi.

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