2012-03-14 28 views
21

Làm cách nào để có được url ứng dụng tương đối từ Request.Url.AbsolutePath?Nhận url tương đối của ứng dụng từ Request.Url.AbsolutePath

VirtualPathUtility dường như chỉ hoạt động với các url ~/XXX?

+0

Xin chào, hãy xem tại đây: http://stackoverflow.com/questions/3681052/get-absolute-url-from-relative-path-refactored-method –

+0

@felipeoriani: Đó là đường dẫn tương đối tuyệt đối (đối diện với những gì Tôi muốn). – jgauffin

+0

Là 'Request.ApplicationPath' bạn muốn gì không? – V4Vendetta

Trả lời

15

Tôi giải quyết nó như thế này:

// create an absolute path for the application root 
var appUrl = VirtualPathUtility.ToAbsolute("~/"); 

// remove the app path (exclude the last slash) 
var relativeUrl = HttpContext.Current.Request.Url.AbsolutePath.Remove(0, appUrl.Length - 1); 
+1

Cải thiện các lỗi biên dịch. Xin lỗi quên để cho bạn biết. – Pankaj

+0

nếu HttpContext.Current.Request.Url.AbsolutePath Có một% 20 cho không gian những gì tôi nên làm gì? – Marwan

+0

Thay thế bằng không gian. Hoặc sử dụng 'Uri.DecodeXXx()' (không nhớ tên phương thức) – jgauffin

1
String appUrl = VirtualPathUtility.ToAbsolute("~/"); 
String RelativePath = new System.Uri(Page.Request.Url, "").PathAndQuery.Substring(appUrl.Length-1) 
+0

Hwow làm điều đó tạo ra một url ứng dụng tương đối? – jgauffin

+0

Giả sử tôi có URL 'http: // localhost: 49484/Website/Default.aspx' Điều này sẽ cho bạn /Default.aspx – Pankaj

+0

Bạn đang làm điều tương tự như tôi đã làm trong câu trả lời của mình, nhưng hơi phức tạp hơn? – jgauffin

20

của nó một chút muộn để trả lời nhưng có một giải pháp thanh lịch này. Bạn có thể sử dụng

Request.Url.PathAndQuery 

Điều này sẽ trả lại đường dẫn tương đối của trang.

Ví dụ, nếu URL là www.example.com/products?A=a&B=b&C=c, các mảnh trên của mã sẽ trở lại /products?A=a&B=b&C=c

+7

Đó không phải là một url tương đối. Đó là một con đường tuyệt đối từ gốc. Sẽ không làm việc cho các thư mục ảo. – jgauffin

+3

Nhưng đó là những gì nhiều người cần chính xác khi kết thúc ở đây :) – Stefanvds

+0

Điều này không bao gồm bất kỳ neo - mà tôi muốn. –

3

Tôi nghĩ rằng đây là cách sạch nhất:

new Uri(Request.Url.PathAndQuery, UriKind.Relative)) 
4

này đã làm việc cho tôi:

VirtualPathUtility.MakeRelative("~", Request.Url.AbsolutePath) 

Ví dụ: nếu gốc của trang web là /WebsiteRequest.Url.AbsolutePath/Website/some/path, điều này sẽ trả về some/path.

6

Để thực hiện điều này mà không cần sử dụng chuỗi thao tác và xử lý các đường dẫn tương đối của ứng dụng tôi đã sử dụng:

var relativeUrl = VirtualPathUtility.ToAppRelative(
     new Uri(context.Request.Url.PathAndQuery, UriKind.Relative).ToString()); 
+0

Tại sao URI mới (context.Request.Url.PathAndQuery, UriKind.Relative) .ToString() '? Không chỉ 'context.Request.Url.PathAndQuery' giống nhau? – MiMo

0

Để xây dựng dựa trên câu trả lời thoải mái Ashwin Singh - tôi cần liên kết neo để được bao gồm với URL có liên quan của tôi, vì vậy tôi chỉ cần thêm lại vào cuối:

Request.Url.PathAndQuery + Request.Url.Fragment 

Vì vậy, http://localhost:8080/abc/d?foo=bar#jazz trở thành /abc/d?foo=bar#jazz.

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