如何以字典的形式访问所有查询字符串参数

时间:2014-03-15 05:09:51

标签: asp.net-web-api

我有一些动态查询字符串参数,我希望与IDictionary<string,string>进行交互。我该怎么做?

我试过

public IHttpActionResult Get(FromUri]IDictionary<string, string> selections)

as suggested但是查询

/api/MyController?selections%5Bsub-category%5D=kellogs

它总是给我一个包含0项的字典。

我甚至不需要selections前缀。我确实需要所有的查询字符串参数作为字典。我该怎么做以及为什么不能胜任上述工作?

2 个答案:

答案 0 :(得分:57)

您可以使用HttpRequestMessage上的GetQueryNameValuePairs extension method将解析后的查询字符串作为键值对的集合。

public IHttpActionResult Get()
{
    var queryString = this.Request.GetQueryNameValuePairs();
}

您可以创建一些进一步的扩展方法,使其可以使用,如下所述:WebAPI: Getting Headers, QueryString and Cookie Values

/// <summary>
/// Extends the HttpRequestMessage collection
/// </summary>
public static class HttpRequestMessageExtensions
{
    /// <summary>
    /// Returns a dictionary of QueryStrings that's easier to work with 
    /// than GetQueryNameValuePairs KevValuePairs collection.
    /// 
    /// If you need to pull a few single values use GetQueryString instead.
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public static Dictionary<string, string> GetQueryStrings(
        this HttpRequestMessage request)
    {
         return request.GetQueryNameValuePairs()
                       .ToDictionary(kv => kv.Key, kv=> kv.Value, 
                            StringComparer.OrdinalIgnoreCase);
    }
}

答案 1 :(得分:2)

除了nemesv提到的内容之外,您还可以为IDictionary<string,string>创建自定义参数绑定,类似于我在此处显示的方法:

How would I create a model binder to bind an int array?