具有动态元素的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; }
}
如果您需要将动态结构化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; }
}