Holen Sie sich URL ohne Querystring


189

Ich habe eine URL wie diese:

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

Ich möchte davon profitieren http://www.example.com/mypage.aspx.

Kannst du mir sagen, wie ich es bekommen kann?

Antworten:


129

Sie können verwenden 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);

Oder Sie können verwenden substring

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

BEARBEITEN: Ändern der ersten Lösung, um den Vorschlag von brillyfresh in den Kommentaren widerzuspiegeln.


6
url.AbsolutePath gibt nur den Pfadabschnitt der URL zurück (/mypage.aspx); Stellen Sie url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) vor die vollständige URL, die Sie wollten
Ryan

20
Uri.GetLeftPart Methode ist einfacher als erwähnt stackoverflow.com/questions/1188096/…
Edward Wilde

Die substringMethode gibt einen Fehler aus, wenn keine Abfragezeichenfolge vorhanden ist. Verwenden Sie string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);stattdessen.
Stomy

378

Hier ist eine einfachere Lösung:

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

Von hier ausgeliehen: Abfragezeichenfolge abschneiden und saubere URL C # ASP.net zurückgeben


17
Einzeilige Version:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code

uri.GetComponent(ist eine weitere großartige Methode, um Teile eines Uri zu erhalten. Ich wusste bis jetzt nichts über diese beiden!
AaronLS

38

Das ist meine Lösung:

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

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

2
Ich mag das nur, weil du es ohne vollen Uri benutzen kannst.
KingOfHypocrites

Denken Sie daran, dass RawUrldie URL vor dem erneuten Schreiben der URL abgerufen wird. Verwenden Sie sie also möglicherweise AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Beschützer ein


16

Meine Art:

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

oder

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

Dies ist, was ich für NET Core 1.0-Projekt verwende, weil es keine Methode hat Uri.GetLeftPart. Die neueste Version von NET Core (1.1) sollte diese Methode haben (kann nicht bestätigen, da ich
momentan

1
Ich mag dieses, weil das Erstellen von URIs genau das ist, wofür der UriBuilder gedacht ist. Alle anderen Antworten sind (gute) Hacks.
Neun Schwänze

11

Sie können verwenden Request.Url.AbsolutePath, um den Seitennamen sowie Request.Url.Authorityden Hostnamen und den Port abzurufen. Ich glaube nicht, dass es eine eingebaute Immobilie gibt, die Ihnen genau das bietet, was Sie wollen, aber Sie können sie selbst kombinieren.


1
Es gibt mir /mypage.aspx, nicht das, was ich wollte.
Rocky Singh

4

Split () Variation

Ich möchte diese Variante nur als Referenz hinzufügen. URLs sind oft Zeichenfolgen und daher ist es einfacher, die Split()Methode zu verwenden als Uri.GetLeftPart(). Und Split()kann auch dazu gebracht werden, mit relativen, leeren und Nullwerten zu arbeiten, während Uri eine Ausnahme auslöst. Darüber hinaus können URLs auch einen Hash wie /report.pdf#page=10(der das PDF auf einer bestimmten Seite öffnet) enthalten.

Die folgende Methode behandelt alle diese Arten von URLs:

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

Beispielausgabe:


1
Ich bin ziemlich schockiert, dass dies bis zu meinem eigenen keine positiven Stimmen bekommen hat. Dies ist eine großartige Lösung.
Jason

3

Hier ist eine Erweiterungsmethode unter Verwendung der Antwort von @ Kolman. Es ist geringfügig einfacher, sich daran zu erinnern, Path () zu verwenden als GetLeftPart. Möglicherweise möchten Sie Path to GetPath umbenennen, zumindest bis C # Erweiterungseigenschaften hinzugefügt werden.

Verwendung:

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

Die Klasse:

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

Lösung für Silverlight:

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

0

Ich habe eine einfache Erweiterung erstellt, da einige der anderen Antworten null Ausnahmen auslösten, wenn es zunächst keine gab QueryString:

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

Verwendung:

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

0

System.Uri.GetComponents, nur angegebene Komponenten, die Sie möchten.

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

Ausgabe:

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

-1

Ein einfaches Beispiel wäre die Verwendung von Teilzeichenfolgen wie:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.