Как разобрать строку запроса в NameValueCollection в .NET - PullRequest
181 голосов
/ 16 сентября 2008

Я бы хотел разобрать строку типа p1=6&p2=7&p3=8 в NameValueCollection.

Какой самый элегантный способ сделать это, когда у вас нет доступа к Page.Request объекту?

Ответы [ 18 ]

1 голос
/ 17 ноября 2011

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); 
1 голос
/ 23 января 2014

Так как все, кажется, вставляют его решение .. вот мое :-) Мне нужно было это из библиотеки классов без 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")
1 голос
/ 03 июля 2016

Если вам не нужна зависимость System.Web, просто вставьте этот исходный код из класса HttpUtility.

Я только что собрал это из исходного кода Mono . Он содержит HttpUtility и все его зависимости (например, IHtmlString, Helpers, HttpEncoder, HttpQSCollection).

Тогда используйте HttpUtility.ParseQueryString.

https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c

0 голосов
/ 16 сентября 2008

Нажмите Request.QueryString.Keys для NameValueCollection всех параметров строки запроса.

0 голосов
/ 20 августа 2016

Я перевожу на C # версию Джош-Брауна в 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;
}
0 голосов
/ 21 января 2016
        var q = Request.QueryString;
        NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
0 голосов
/ 10 ноября 2013

Это мой код, я думаю, что он очень полезен:

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;
}
0 голосов
/ 24 февраля 2015

Чтобы получить все значения строки запроса, попробуйте это:

    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
...