【问题标题】:How to access all querystring parameters as a dictionary如何将所有查询字符串参数作为字典访问
【发布时间】:2021-09-02 20:42:29
【问题描述】:

我有一些动态查询字符串参数,我想以IDictionary<string,string> 的形式与之交互。我该怎么做?

我试过了

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

as suggested 但对于

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

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

我什至不需要selections 前缀。我实际上只需要所有查询字符串参数作为字典。我该怎么做?为什么上述方法不起作用?

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    您可以使用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);
        }
    }
    

    【讨论】:

    • 在该网页帖子上有一条有趣的评论,尽管它是“如果重复查询参数,这将引发重复键异常”。请注意,重复的查询字符串键是完全有效的 URL 语法。
    • 如果查询字符串包含一个编码的 &(和号),像这样:?key=value1%26value2%26value3 然后键在 & 字符处被“拆分”(你最终得到 3 个字典条目而不是 1 个)。这是什么原因?
    【解决方案2】:

    除了 nemesv 提到的之外,您还可以为 IDictionary&lt;string,string&gt; 创建自定义参数绑定,类似于我在这里展示的方法:

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

    【讨论】:

      【解决方案3】:

      添加它,因为我觉得这在这里会有所帮助。

      我们可以使用来自System.Web 命名空间的HttpUtility.ParseQueryString(&lt;string&gt;) 方法。此方法将解析作为输入提供的查询字符串并将其作为NameValueCollection 返回。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        相关资源
        最近更新 更多