我在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数据更简单。