将HTTP POST参数映射到Dictionary <string,string [] =“”>

时间:2017-03-09 10:16:29

标签: c# asp.net asp.net-mvc

我遇到了ASP.NET MVC操作的参数映射问题。我从浏览器发布类似的数据:

{
   "query" : "some search phrase",
   "faceting" : {
      "colors" : ["red", "blue"],
      "brands" : ["Fantastic"]
}

这就是动作方法签名的样子:

public async Task<JsonResult> External(string query, Dictionary<string, string[]> faceting, int page = 1)

预期的结果是带有键,“颜色”和“品牌”的词典,但我得到了三个键:“colors [0]”,“colors [1]”和“brands [0]”,数组中每个都有一个元素。

我无法将操作方法​​签名更改为

public async Task<JsonResult> External(string query, colors string[], brands string[], faceting, int page = 1)

因为刻面是动态的,我现在不接受什么键。在编写代码时,客户端既不会发布给定示例中的任何一个,也不会添加更多我不知道的密钥。

是否有任何想法如何修复映射,或任何其他构造而不是更好的字典?

2 个答案:

答案 0 :(得分:0)

这可能对您有所帮助

async Task<JsonResult> External(int p)
    {
        var formData = await GetJObjectFromFormData();
        if (formData == null)
            throw new ArgumentNullException("form data");
        string query = formData["query"].ToObject<string>();
        Debug.WriteLine("query : " + query);
        Dictionary<string, string[]> faceting = formData["faceting"]
            .ToDictionary<JToken, string, string[]>(
            (j) =>
            {
                return ((JProperty)j).Name;
            },
            (j) =>
            {
                return j.First.ToObject<string[]>();
            });
        foreach (var key in faceting.Keys)
        {
            Debug.WriteLine("key : {0}, values : {1}", key, string.Join(",", faceting[key]));
        }
        return Json("");

    }

方法从url接受p参数。

data.cartesian(data).map(pair => compare(pair._1, pair._2))

答案 1 :(得分:0)

我通过稍微改变设计解决了这个问题。操作方法签名现在看起来像这样:

public async Task<JsonResult> External(string query, Facet[] faceting, int page = 1)

和Facet类是这样的:

public class Facet
{
    public string Name { get; set; }
    public string Value { get; set; }
}

如果我有两种颜色,我只需提交两个名称为“颜色”的Facet对象。

然后我必须以与我最初计划不同的方式处理方面,但这种方法比创建我自己的模型绑定器或自己处理JSON数据更简单。