我有这样的C#视图类:
public class DataObject
{
public int Number { get; set; }
public dynamic Data { get; set; } // <-----
}
在这样的MVC方法中使用
[HttpPost]
public ActionResult SaveData(DataObject request) {}
问题是我想在DataObject
类的Data
属性中收到多种类型的对象。
也就是说,我希望这两个都可以作为有效的输入JSON对象。
类型1
{
Number: 1,
Data: {
Text: "a text"
}
}
类型2
{
Number: 2,
Data: {
Value: 1,
Options: { 1, 2, 3, 4 }
}
}
是否有一种方法可以使用动态对象或其他类型的JSON库魔术(只是使属性动态都没有做任何事情(?
我要做的就是将此数据存储在SQL列NVarchar字段中,然后以后返回(通过实体框架(。
替代解决方案是为每种类型的输入创建一个视图模型,但是由于它将有100个变体创建所有这些视图,并且相应的输入方法将很麻烦。
根据注释请求添加更多详细信息:该方法是通过Angular调用的。
pub.Save = function (jsonData) {
return $http(
{
method: "POST",
url: baseURL + "/Save",
data: { request: jsonData}, // tried this for string
// data: jsonData, // original way
timeout: 30000
}
)
.then(function (result) {
return result.data;
});
}
在服务器端,DTO类必须与有效负载所携带的相同属性名称匹配。
public class DataObject
{
public string test { get; set; } // <-----
}
因此,您的保存方法保持不变:
[HttpPost]
public ActionResult SaveData(DataObject request) {}
有效载荷JSON在对象request.test
中,但其静脉均匀。使用JSON库值。
它如何处理多种不同类型的变量?
应将其供应到dynamic
类型为:
dynamic obj = JsonConvert.DeserializeObject(request.test, typeof(object));
//Properties within the obj are checked at run time.
if(obj.Text != null) {
//Do your thing
}
if(obj.Value != null) {
//Do your thing
}
if(obj.Options != null) {
//Do your thing
}
通过将数据转换为客户端的JSON字符串,我能够将其发送到字符串属性,从而能够为所有对象使用相同的键入视图。
我在保存对象时最终这样做(我在前端使用了Angular(,将JSON对象转换为字符串。
entry.Data = angular.toJson(entryData.Data, false);
然后,当从MVC中获得JSON字符串时,我这样做是为了将其恢复到真正的JavaScript对象。
entry.Data = angular.fromJson(entry.Data);
MVC不会先将JSON对象接受到文本属性中,而不会将其首先放入JSON字符串中。
使用上述方法我在数据库中存储这样的数据:
"{"Value":123,"Currency":"EUR"}"