Nhận url mà không cần chuỗi truy vấn


189

Tôi có một URL như thế này:

http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye

Tôi muốn nhận được http://www.example.com/mypage.aspxtừ nó.

Bạn có thể cho tôi biết làm thế nào tôi có thể nhận được nó?

Câu trả lời:


129

Bạn có thể dùng System.Uri

Uri url = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
string path = String.Format("{0}{1}{2}{3}", url.Scheme, 
    Uri.SchemeDelimiter, url.Authority, url.AbsolutePath);

Hoặc bạn có thể sử dụng substring

string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
string path = url.Substring(0, url.IndexOf("?"));

EDIT: Sửa đổi giải pháp đầu tiên để phản ánh đề xuất của brillyfresh trong các bình luận.


6
url.AbsolutePath chỉ trả về phần đường dẫn của URL (/mypage.aspx); trả trước url.Scheme (http) + Uri.SchemeD006iter (: //) + url.Authority (www.somesite.com) cho URL đầy đủ mà bạn muốn
Ryan

20
Phương thức Uri.GetLeftPart đơn giản hơn như stackoverflow.com/questions/1188096/
Edward Wilde

Các substringphương pháp sẽ cho lỗi nếu không có chuỗi truy vấn. Sử dụng string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);thay thế.
stomy

378

Đây là một giải pháp đơn giản hơn:

var uri = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
string path = uri.GetLeftPart(UriPartial.Path);

Mượn từ đây: Cắt ngắn chuỗi truy vấn & trả lại URL sạch C # ASP.net


17
Phiên bản một dòng:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code

uri.GetComponent(là một phương pháp tuyệt vời khác để lấy các bộ phận của Uri. Tôi đã không biết về hai người này cho đến bây giờ!
AaronLS

38

Đây là giải pháp của tôi:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);

35
Request.RawUrl.Split(new[] {'?'})[0];

2
Tôi thích điều này chỉ vì thực tế bạn có thể sử dụng nó mà không cần một uri đầy đủ.
KingOfHypocites

Hãy nhớ rằng RawUrlsẽ nhận được URL trước khi viết lại URL, vì vậy có lẽ nên sử dụng AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Người bảo vệ một


16

Cách của tôi

new UriBuilder(url) { Query = string.Empty }.ToString()

hoặc là

new UriBuilder(url) { Query = string.Empty }.Uri

Đây là những gì tôi sử dụng cho dự án NET Core 1.0 vì nó không có phương pháp Uri.GetLeftPart. Phiên bản mới nhất của NET Core (1.1) nên có phương thức đó (không thể xác nhận vì hiện tại tôi không sử dụng lõi 1.1)
psulek

1
Tôi thích cái này vì xây dựng URI chính xác là những gì UriBuilder dành cho. Tất cả các câu trả lời khác là (tốt) hack.
Cửu Vĩ

11

Bạn có thể sử dụng Request.Url.AbsolutePathđể lấy tên trang và Request.Url.Authoritytên máy chủ và cổng. Tôi không tin rằng có một tài sản được xây dựng để cung cấp cho bạn chính xác những gì bạn muốn, nhưng bạn có thể tự kết hợp chúng.


1
Đó là cho tôi /mypage.aspx, không phải những gì tôi muốn.
Rocky Singh

4

Biến ()

Tôi chỉ muốn thêm biến thể này để tham khảo. Các Url thường là các chuỗi và vì vậy sử dụng Split()phương thức này đơn giản hơn Uri.GetLeftPart(). Và Split()cũng có thể được thực hiện để làm việc với các giá trị tương đối, trống và null trong khi Uri đưa ra một ngoại lệ. Ngoài ra, các Url cũng có thể chứa một hàm băm như/report.pdf#page=10 (mở pdf ở một trang cụ thể).

Phương pháp sau đây liên quan đến tất cả các loại Url này:

   var path = (url ?? "").Split('?', '#')[0];

Kết quả ví dụ:


1
Tôi khá sốc vì điều này đã không nhận được bất kỳ sự ủng hộ nào cho đến khi của riêng tôi. Đây là một giải pháp tuyệt vời.
jason

3

Đây là một phương pháp mở rộng sử dụng câu trả lời của @ Kolman. Việc sử dụng Path () dễ dàng hơn một chút so với GetLeftPart. Bạn có thể muốn đổi tên Đường dẫn thành GetPath, ít nhất là cho đến khi họ thêm thuộc tính mở rộng vào C #.

Sử dụng:

Uri uri = new Uri("http://www.somewhere.com?param1=foo&param2=bar");
string path = uri.Path();

Lớp:

using System;

namespace YourProject.Extensions
{
    public static class UriExtensions
    {
        public static string Path(this Uri uri)
        {
            if (uri == null)
            {
                throw new ArgumentNullException("uri");
            }
            return uri.GetLeftPart(UriPartial.Path);
        }
    }
}

1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];


0

Giải pháp cho Silverlight:

string path = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);

0

Tôi đã tạo một tiện ích mở rộng đơn giản, vì một vài câu trả lời khác đã đưa ra các ngoại lệ không có giá trị nếu không QueryStringbắt đầu bằng:

public static string TrimQueryString(this string source)
{ 
    if (string.IsNullOrEmpty(source))
            return source;

    var hasQueryString = source.IndexOf('?') != -1;

    if (!hasQueryString)
        return source;

    var result = source.Substring(0, source.IndexOf('?'));

    return result;
}

Sử dụng:

var url = Request.Url?.AbsoluteUri.TrimQueryString() 

0

System.Uri.GetComponents, chỉ cần các thành phần bạn muốn.

Uri uri = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
uri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped);

Đầu ra:

http://www.example.com/mypage.aspx

-1

ví dụ đơn giản sẽ sử dụng chuỗi con như:

string your_url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
string path_you_want = your_url .Substring(0, your_url .IndexOf("?"));

-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.