我有一个C#视图类,例如:
public class DataObject
{
public int Number { get; set; }
public dynamic Data { get; set; } // <-----
}
在像这样的MVC方法中使用
[HttpPost]
public ActionResult SaveData(DataObject request) {}
问题是我想在Data
类的DataObject
属性中接收多种类型的对象。
也就是说,我希望这两个作为有效的输入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;
});
}
答案 0 :(得分:0)
在服务器端,DTO类必须与有效负载所携带的相同属性名称匹配。
public class DataObject
{
public string test { get; set; } // <-----
}
因此,您的保存方法保持不变:
[HttpPost]
public ActionResult SaveData(DataObject request) {}
有效负载json位于对象request.test
中,但是它已被封装。
使用Json Library对其进行去除。
如何处理多种不同类型的变量?
将其解除为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
}
答案 1 :(得分:0)
通过在客户端将数据转换为JSON字符串,我能够将其发送到字符串属性,从而能够为所有对象使用相同的类型视图。
我最后在保存对象时这样做(我在前端使用了角度),将Json对象转换为字符串。
entry.Data = angular.toJson(entryData.Data, false);
然后当从MVC获取json字符串时,我这样做是为了让它回到一个真正的javascript对象。
entry.Data = angular.fromJson(entry.Data);
MVC不会将JSON对象接受到text属性中,而不会先将其变为json字符串。
使用上述方法我将数据存储在我的数据库中:
"{\"Value\":123,\"Currency\":\"EUR\"}"