我遇到了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)
因为刻面是动态的,我现在不接受什么键。在编写代码时,客户端既不会发布给定示例中的任何一个,也不会添加更多我不知道的密钥。
是否有任何想法如何修复映射,或任何其他构造而不是更好的字典?
答案 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数据更简单。