我正在尝试将属性名称中带点的JSON反序列化为键值格式。我正在使用内置的ASP.NET MVC模型绑定。似乎将点解释为对象表示法,而不仅仅是键值对象。有什么方法可以使它正确地反序列化为忽略点的键值吗?这很重要,因为数据将需要再次以这种格式输出。
控制器动作
[HttpPost]
public ActionResult SaveProgress(int id, ProgressVM data)
{
// ProgressVM Data property has an item with key "prop" and a null value, nothing else
}
查看模型
public class ProgressVM
{
public int ID { get; set; }
public Dictionary<string, string> Data { get; set; }
}
JSON范例
{
"ID": 123,
"Data": {
"prop.0.name": "value",
"prop.0.id": "value",
"prop.1.name": "value",
"prop.2.name": "value",
"prop.3.name": "value"
}
}
首先,在操作中传递参数时POST
,仅传递一个参数,而不传递多个参数。因此,尝试创建一个将包含Id和ProgressVM模型的模型。
现在,针对反序列化的问题。JsonValueProviderFactory类似乎出了点问题,因为它没有绑定嵌套Dictionary<string, string>
的ProgressVM
模型。我知道,因为我尝试ModelBinder
为此模型创建一个,但是它在上失败DictionaryValueProvider
,而不是绑定该Data
属性。不幸的是,我没有搜索为什么会发生这种情况,这是一个错误JsonValueProviderFactory
吗?我不知道,所以我迅速转到了另一个解决方法。
为什么不尝试将JSON字符串而不是模型提供给控制器,然后在控制器的主体中反序列化输入呢?看下面的例子:
JavaScript代码,使用jQuery AJAX发布数据
var data = {
"ID": 123,
"Data": {
"prop.0.name": "value",
"prop.0.id": "value",
"prop.1.name": "value",
"prop.2.name": "value",
"prop.3.name": "value"
}
};
$.ajax({
url: '@Url.Action("SaveProgress", "Home")',
data: { "data": JSON.stringify(data) },
method: "POST"
});
ASP.NET MVC控制器操作
[HttpPost]
public ActionResult SaveProgress(string data)
{
var json = JsonConvert.DeserializeObject<ProgressVM>(data);
// Rest of code here
}
这是在回答您的问题吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句