具有动态元素的ViewModel

时间:2015-12-03 09:05:22

标签: c# json asp.net-mvc deserialization viewmodel

我需要在.NET中接收下一个JSON

"currentData": 
{ 
  "Name": {"system": "wfdss", "canWrite": true }, 
  "DiscoveryDateTime": { "system": "wfdss", "canWrite": true },
  "Code": { "system": "code", "canWrite": false }, 
   ... 
}

这些元素是动态的,它没有默认元素,所以,我如何定义一个类在下一个模型之后做这个:

public class currentData
{
    //TODO
    //<Data Element Name>: { 
    //data element system: <STRING of system>, 
    //the last system to update data element canWrite: <Boolean> 
    //true if requesting system may edit data element (based on ADS),    otherwise false. }, ...
    public List<Property> property { get; set; }
}

public class Property
{
    public string system { get; set; }
    public string canWrite { get; set; }
}

2 个答案:

答案 0 :(得分:1)

如果您需要将动态结构化Json发布到控制器,我有一个坏消息 - 您无法在MVC中自动映射。 MVC模型绑定机制仅适用于严格类型的集合 - 您必须知道结构

如果使用FormCollection并手动从中获取值,我可以建议您使用其中一个选项:

[HttpPost]
public JsonResult JsonAction(FormCollection collection)
{
    string CurrentDataNameSystem = collection["currentData.Name.system"];
    // and so on...
    return Json(null);
}

另一种选择是将动态json作为字符串传递给你,然后手动取消它:

[HttpPost]
public JsonResult JsonAction(string json)
{
    //You probably want to try desirialize it to many different types you can wrap it with try catch 
    Newtonsoft.Json.JsonConvert.DeserializeObject<YourObjectType>(jsonString);
    return Json(null);
}

无论如何,我的观点是 - 除非你真的需要在MVC中,否则你不应该使用动态json。

我建议你创建包含所有可通过字段但仍然可以为空的对象类型,这样你就可以传递你的Json,它将使用模型绑定MVC机制进行映射,但是某些字段将是null

答案 1 :(得分:0)

我认为你得到的类型格式是带有字典的对象。 所以我认为您需要将数据反序列化为此。

/fancybox/source/jquery.fancybox.pack.js