具有动态元素的ViewModel

本文关键字:ViewModel 元素 动态 | 更新日期: 2023-09-27 18:25:31

我需要在.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; }
}

具有动态元素的ViewModel

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

如果使用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,否则你不应该搞砸它。

我建议您创建包含所有可传递字段但使其全部为null的对象类型,这样您就可以传递Json,它将使用模型绑定MVC机制进行映射,但有些字段将是null

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

    public class ContainerObject
    {
        public Dictionary<String,Property> currentData { get; set; }
    }