2009-03-18 8 views
167

Ich habe eine Zeichenfolge in .NET, die eigentlich eine URL ist. Ich möchte einen einfachen Weg, um den Wert von einem bestimmten Parameter zu erhalten.Get URL-Parameter aus einer Zeichenfolge in .NET

Normalerweise würde ich einfach Request.Params["theThingIWant"] verwenden, aber diese Zeichenfolge stammt nicht aus der Anfrage. Ich kann wie so einen neuen Uri Artikel erstellen:

Uri myUri = new Uri(TheStringUrlIWantMyValueFrom); 

I myUri.Query können Sie den Query-String bekommen ... aber dann muß ich anscheinend einig regexy Weg finden, es Aufspaltung.

Fehle ich etwas Offensichtliches, oder gibt es keine eingebaute Möglichkeit, dies zu tun, um eine Regex irgendeiner Art zu erstellen?

Antwort

361

Verwendung statischer ParseQueryString Methode der System.Web.HttpUtility Klasse, die NameValueCollection zurückgibt.

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad"); 
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1"); 

prüfen Dokumentation http://msdn.microsoft.com/en-us/library/ms150046.aspx

+11

Dies scheint den ersten Parameter nicht zu erkennen. zB Parsing "http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1" erkennt den Parameter nicht q –

+0

@ Andrew Ich bestätige. Es ist seltsam (Bug?). Sie können 'HttpUtility.ParseQueryString (myUri.Query) .Get (0)' trotzdem verwenden und den ersten Parameter extrahieren. ' –

+0

Jedes .NET-Tool zum Erstellen einer parametrisierten Abfrage-URL? – Shimmy

11

Sieht aus, als sollten Sie die Werte von myUri.Query durchlaufen und von dort analysieren.

string desiredValue; 
foreach(string item in myUri.Query.Split('&')) 
{ 
    string[] parts = item.Replace('?', '').Split('='); 
    if(parts[0] == "desiredKey") 
    { 
     desiredValue = parts[1]; 
     break; 
    } 
} 

Ich würde diesen Code nicht verwenden, ohne es auf einer Reihe von ungültigen URLs zu testen. Es könnte brechen auf einige/alle diese:

  • hello.html?
  • hello.html?valuelesskey
  • hello.html?key=value=hi
  • hello.html?hi=value?&b=c
  • etc
2

Verwenden .NET Reflector die FillFromString Methode von System.Web.HttpValueCollection anzuzeigen. Das gibt Ihnen den Code, den ASP.NET verwendet, um die Request.QueryString-Auflistung zu füllen. Diese

34

ist wahrscheinlich das, was Sie wollen

var uri = new Uri("http://domain.test/Default.aspx?var1=true&var2=test&var3=3"); 
var query = HttpUtility.ParseQueryString(uri.Query); 

var var2 = query.Get("var2"); 
+0

Danke sehr kompakt und nützlich –

9

@ Andrew und @CZFox

ich den gleichen Fehler hatte und die Ursache gefunden, dass der Parameter eine in der Tat zu sein: http://www.example.com?param1 und param1 nicht, die ist was man erwarten würde.

Durch Entfernen aller Zeichen vor und einschließlich des Fragezeichens wird dieses Problem behoben.Also im Grunde die HttpUtility.ParseQueryString Funktion erfordert lediglich einen gültigen Abfrage-String-Parameter, die nur Zeichen nach dem Fragezeichen, wie in:

HttpUtility.ParseQueryString ("param1=good&param2=bad") 

Meine Abhilfe:

string RawUrl = "http://www.example.com?param1=good&param2=bad"; 
int index = RawUrl.IndexOf ("?"); 
if (index > 0) 
    RawUrl = RawUrl.Substring (index).Remove (0, 1); 

Uri myUri = new Uri(RawUrl, UriKind.RelativeOrAbsolute); 
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");` 
+0

Wenn der URI instanziiert wird bekomme ich den Fehler "Ungültiger URI: Das Format des URI konnte nicht ermittelt werden." Ich glaube nicht, dass diese Lösung so funktioniert wie beabsichtigt. –

+0

@PaulMatthews, Sie sind richtig. Zur Zeit dieser gegebenen Lösung verwendete ich das ältere .net Framework 2.0. Um Ihre Aussage zu bestätigen, habe ich diese Lösung kopiert und in LINQPad v2 von Joseph Albahara eingefügt und den gleichen Fehler erhalten, den Sie erwähnt haben. –

+0

@PaulMatthews, Um zu beheben, entfernen Sie die Zeile, die Uri liest myUri = new Uri (RawUrl); und übergeben Sie RawUrl einfach an die letzte Anweisung wie in: string param1 = HttpUtility.ParseQueryString (RawUrl) .Get ("param2"); –

2

Sie die folgende Abhilfe verwenden können, für sie zu arbeiten auch mit dem ersten Parameter:

var param1 = 
    HttpUtility.ParseQueryString(url.Substring(
     new []{0, url.IndexOf('?')}.Max() 
    )).Get("param1"); 
19

Hier ist eine andere Alternative, wenn aus irgendeinem Grund, können Sie nicht oder nicht HttpUtility.ParseQueryString() verwenden wollen.

Dies ist so gebaut, dass es etwas tolerant gegenüber "fehlerhaften" Abfragezeichenfolgen ist, d. H. http://test/test.html?empty= wird zu einem Parameter mit einem leeren Wert. Der Aufrufer kann die Parameter bei Bedarf überprüfen.

-Test

[TestClass] 
public class UriHelperTest 
{ 
    [TestMethod] 
    public void DecodeQueryParameters() 
    { 
     DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>()); 
     DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>()); 
     DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } }); 
     DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } }); 
     DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } }); 
     DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } }); 
     DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } }); 
     DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } }); 
     DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } }); 
     DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22", 
      new Dictionary<string, string> 
      { 
       { "q", "energy+edge" }, 
       { "rls", "com.microsoft:en-au" }, 
       { "ie", "UTF-8" }, 
       { "oe", "UTF-8" }, 
       { "startIndex", "" }, 
       { "startPage", "1%22" }, 
      }); 
     DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } }); 
    } 

    private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected) 
    { 
     Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters(); 
     Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri); 
     foreach (var key in expected.Keys) 
     { 
      Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri); 
      Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri); 
     } 
    } 
} 
+1

Es scheint, Sie haben vergessen, dass ein Querystring doppelte Werte enthalten kann (e.g: mehrere wählen) – Dementic

+0

Danke, du hast Recht. Ich habe es geändert. – alsed42

0

, wenn Sie Ihre Abfrage-Zeichenfolge auf Standardseite in erhalten möchten .Default Seite aktuelle Seite url bedeutet. können Sie diesen Code versuchen:

string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city"); 
1
HttpContext.Current.Request.QueryString.Get("id"); 
+0

wie Sie dies mit einer Zeichenfolge –

1

Oder wenn Sie nicht wissen, die URL (so wie Hardcoding zu vermeiden, die

Beispiel AbsoluteUri verwenden ...

 //get the full URL 
     Uri myUri = new Uri(Request.Url.AbsoluteUri); 
     //get any parameters 
     string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status"); 
     string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message"); 
     switch (strStatus.ToUpper()) 
     { 
      case "OK": 
       webMessageBox.Show("EMAILS SENT!"); 
       break; 
      case "ER": 
       webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg); 
       break; 
     } 
-2

Ich benutzte es und es lief perfekt

<%=Request.QueryString["id"] %> 
+1

aus einer Zeichenfolge nicht Abfragezeichenfolge verwenden –

Verwandte Themen