18 ответов:
для этого есть встроенная утилита .NET: HttpUtility.ParseQueryString
// C# NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);' VB.NET Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)возможно, Вам придется заменить
querystringСnew Uri(fullUrl).Query.
HttpUtility.ParseQueryString будет работать до тех пор, пока вы находитесь в веб-приложении или не возражаете против включения зависимости от системы.Сеть. Другой способ сделать это:
NameValueCollection queryParameters = new NameValueCollection(); string[] querySegments = queryString.Split('&'); foreach(string segment in querySegments) { string[] parts = segment.Split('='); if (parts.Length > 0) { string key = parts[0].Trim(new char[] { '?', ' ' }); string val = parts[1].Trim(); queryParameters.Add(key, val); } }
Я хотел удалить зависимость от системы.Web, чтобы я мог проанализировать строку запроса развертывания ClickOnce,имея предварительные условия, ограниченные "подмножеством только для клиента".
Мне понравился ответ РП. Я добавил некоторую дополнительную логику.
public static NameValueCollection ParseQueryString(string s) { NameValueCollection nvc = new NameValueCollection(); // remove anything other than query string from url if(s.Contains("?")) { s = s.Substring(s.IndexOf('?') + 1); } foreach (string vp in Regex.Split(s, "&")) { string[] singlePair = Regex.Split(vp, "="); if (singlePair.Length == 2) { nvc.Add(singlePair[0], singlePair[1]); } else { // only one key with no value specified in query string nvc.Add(singlePair[0], string.Empty); } } return nvc; }
мне нужна была функция, которая немного более универсальна, чем то, что уже было предоставлено при работе с запросами OLSC.
- значения могут содержать несколько одинаковых знаков
- декодировать закодированные символы как в имени, так и в значении
- способен работать на клиентской платформе
- способен работать на мобильных платформах.
вот мое решение:
Public Shared Function ParseQueryString(ByVal uri As Uri) As System.Collections.Specialized.NameValueCollection Dim result = New System.Collections.Specialized.NameValueCollection(4) Dim query = uri.Query If Not String.IsNullOrEmpty(query) Then Dim pairs = query.Substring(1).Split("&"c) For Each pair In pairs Dim parts = pair.Split({"="c}, 2) Dim name = System.Uri.UnescapeDataString(parts(0)) Dim value = If(parts.Length = 1, String.Empty, System.Uri.UnescapeDataString(parts(1))) result.Add(name, value) Next End If Return result End Functionэто может быть не плохая идея, чтобы лавировать
<Extension()>на что тоже добавьте эту возможность в сам Uri.
сделать это без
System.Web, без написания его самостоятельно, и без дополнительных пакетов NuGet:
- добавить ссылку
System.Net.Http.Formatting- добавить
using System.Net.Http;используйте этот код:
new Uri(uri).ParseQueryString()https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs. 118).aspx
private void button1_Click( object sender, EventArgs e ) { string s = @"p1=6&p2=7&p3=8"; NameValueCollection nvc = new NameValueCollection(); foreach ( string vp in Regex.Split( s, "&" ) ) { string[] singlePair = Regex.Split( vp, "=" ); if ( singlePair.Length == 2 ) { nvc.Add( singlePair[ 0 ], singlePair[ 1 ] ); } } }
Я только что понял, что Web API Client есть
ParseQueryStringметод расширения, который работает наUriи возвращает aHttpValueCollection:var parameters = uri.ParseQueryString(); string foo = parameters["foo"];
просто запрос доступа.строки запроса. AllKeys упоминается как еще один ответ просто получает вам массив ключей.
HttpUtility.ParseQueryString(Request.Url.Query)возвращениеHttpValueCollection(внутренний класс). Он наследует отNameValueCollection.var qs = HttpUtility.ParseQueryString(Request.Url.Query); qs.Remove("foo"); string url = "~/Default.aspx"; if (qs.Count > 0) url = url + "?" + qs.ToString(); Response.Redirect(url);
Если вам не нужна система.Веб-зависимость, просто вставьте этот исходный код из класса HttpUtility.
Я просто возьму это вместе с исходным кодом моно. Он содержит HttpUtility и все его зависимости (например, IHtmlString, Helpers, HttpEncoder, HttpQSCollection).
затем использовать
HttpUtility.ParseQueryString.https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
Так как каждый, кажется, вставляет свое решение.. вот мой :-) Мне это нужно было из библиотеки классов без
System.Webдля извлечения параметров идентификатора из сохраненных гиперссылок.думал, что поделюсь, потому что я нахожу это решение быстрее и лучше выглядит.
public static class Statics public static Dictionary<string, string> QueryParse(string url) { Dictionary<string, string> qDict = new Dictionary<string, string>(); foreach (string qPair in url.Substring(url.IndexOf('?') + 1).Split('&')) { string[] qVal = qPair.Split('='); qDict.Add(qVal[0], Uri.UnescapeDataString(qVal[1])); } return qDict; } public static string QueryGet(string url, string param) { var qDict = QueryParse(url); return qDict[param]; } }использование:
Statics.QueryGet(url, "id")
если вы хотите избежать зависимости от системы.Веб, который требуется использовать HttpUtility.ParseQueryString можно использовать
Uriметод расширенияParseQueryStringнашли вSystem.Net.Http.обязательно добавьте ссылку (если вы еще этого не сделали) на
System.Net.Httpв вашем проекте.обратите внимание, что вы должны преобразовать тело ответа в действительное
Uri, Так чтоParseQueryString(inSystem.Net.Http)работает.string body = "value1=randomvalue1&value2=randomValue2"; // "http://localhost/query?" is added to the string "body" in order to create a valid Uri. string urlBody = "http://localhost/query?" + body; NameValueCollection coll = new Uri(urlBody).ParseQueryString();
чтобы получить все значения строки запроса, попробуйте так:
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring) Dim sb As New StringBuilder("<br />") For Each s As String In qscoll.AllKeys Response.Write(s & " - " & qscoll(s) & "<br />") Next s
var q = Request.QueryString; NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
я перевожу на C# версию josh-brown в VB
private System.Collections.Specialized.NameValueCollection ParseQueryString(Uri uri) { var result = new System.Collections.Specialized.NameValueCollection(4); var query = uri.Query; if (!String.IsNullOrEmpty(query)) { var pairs = query.Substring(1).Split("&".ToCharArray()); foreach (var pair in pairs) { var parts = pair.Split("=".ToCharArray(), 2); var name = System.Uri.UnescapeDataString(parts[0]); var value = (parts.Length == 1) ? String.Empty : System.Uri.UnescapeDataString(parts[1]); result.Add(name, value); } } return result; }
Это мой код, я думаю, что это очень полезно:
public String GetQueryString(string ItemToRemoveOrInsert = null, string InsertValue = null ) { System.Collections.Specialized.NameValueCollection filtered = new System.Collections.Specialized.NameValueCollection(Request.QueryString); if (ItemToRemoveOrInsert != null) { filtered.Remove(ItemToRemoveOrInsert); if (!string.IsNullOrWhiteSpace(InsertValue)) { filtered.Add(ItemToRemoveOrInsert, InsertValue); } } string StrQr = string.Join("&", filtered.AllKeys.Select(key => key + "=" + filtered[key]).ToArray()); if (!string.IsNullOrWhiteSpace(StrQr)){ StrQr="?" + StrQr; } return StrQr; }
Comments