我在MVC5中绑定一组键值对象时遇到问题。这是JSON:
{
"expiration": "2013-12-03T04:30:41.206Z",
"conditions": [
{
"acl": "private"
},
{
"bucket": "ryvus.upload.test"
},
{
"Content-Type": "application/vnd.ms-excel"
},
{
"success_action_status": "200"
},
{
"key": "fc42ae8a-1f6e-4955-a669-8272ad650cb9.csv"
},
{
"x-amz-meta-qqfilename": "simpleupload.csv"
}
]
}
如果我尝试将条件绑定到这样的Dictionary<string, string>
:
// View Model
public class ResponseVM
{
public DateTime Expiration { get; set; }
public Dictionary<string, string> Conditions { get; set; }
}
// Controller Action
public ActionResult MyHandler(ResponseVM s3Response)
{
//do something
return JSON(null);
}
我得到6个条目,其键为“0”,“1”,“2”,“3”,“4”,“5”和空值。我似乎非常接近,但我尝试了一堆不同的类型而没有成功,Dictionary<string, string>
是我能得到的最好的。
我错过了一些完全明显的东西吗?
答案 0 :(得分:1)
由于无法更改JSON方案,最简单的方法是更改类以匹配JSON。
public class ResponseVM
{
public DateTime Expiration { get; set; }
public List<Dictionary<string, string>> Conditions { get; set; }
}
条件是地图列表。
顺便说一下,视图模型(VM)的目的是抽象视图。这不是输入。
答案 1 :(得分:0)
$.ajax({
type: 'POST',
dataType: 'json',
data: JSON.stringify(data),
url: "your url",
contentType: 'application/json; charset=utf-8',
success: function (t) {
// code here
}
});
试试吧。
我没有绑定到字典,但数组工作正常。
答案 2 :(得分:0)
我认为问题在于conditions
结构无法映射到键值对...... conditions
结构实际上是
一组不同类型的对象,例如第一个对象可以建模:
public class ACL {
public string acl { get; set; }
}
下一个对象如:
public class Bucket {
public string bucket { get; set; }
}
等。它不是可绑定的键值对。
要使条件结构绑定到KeyValuePair<TKey, TValue>
结构,您希望JSON看起来更像这样:
{
"expiration": "2013-12-03T04:30:41.206Z",
"conditions": [
{
Key: "acl",
Value: "private"
},
{
Key: "bucket",
Value: "ryvus.upload.test"
},
...
]
}
编辑:如果你不能改变JSON模式并且你不打算编写自定义绑定器那么下面的结构应该可以工作,但它是
不漂亮,因为NVPair
中的每个项目都有conditions
的实例。
你的模特:
public class NVPair {
public string acl { get; set; }
public string bucket { get; set; }
[JsonProperty("Content-Type")]
public string ContentType { get; set; }
public string success_action_status { get; set; }
public string key { get; set; }
...
}
public class ResponseVM
{
public DateTime Expiration { get; set; }
public List<NVPair> Conditions { get; set; }
}
这样每个nvp都会有一个单独的项目。但它应该绑定。
如果您不想要JSON.Net的JsonProperty
attrib,您可以DataContract
使用{{1}}