将 HTTP POST 参数映射到字典<字符串、字符串[]>



我在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)

预期的结果是键,"颜色"one_answers"品牌",但是我得到了三个键:"颜色[0]"," colors [1]"one_answers" brands [0]","带有每个元素的数组。

我无法将动作方法签名更改为

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

因为刻面是动态的,我现在没有收到什么密钥。客户端不能发布一个给定的示例,也不能添加更多键,我在编写代码时不知道。

任何想法如何修复映射,或任何其他构造而不是词典可以更好地工作?

这可能会帮助您

async Task<JObject> GetJObjectFromFormData()
    {
        using (Stream strea = new MemoryStream())
        {
            Request.InputStream.Position = 0;
            await Request.InputStream.CopyToAsync(strea);
            strea.Position = 0;
            using (StreamReader reader = new StreamReader(strea))
            {
                var req = reader.ReadToEnd();
                return !string.IsNullOrEmpty(req) ? JObject.Parse(req) : null;
            }
        }
    }

方法从url接受p参数。

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("");
    }

我通过稍微更改设计解决了它。动作方法签名现在看起来像这样:

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

和这样的刻画类:

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

如果我有两种颜色,我简单地提交了两个带有名称="颜色"的刻面对象。

我必须以与首先打算这样做的不同方式处理方面,但是这种方法比创建自己的模型粘合剂或自己处理JSON数据更简单。

最新更新