在MVC方法

时间:2017-04-21 06:34:15

标签: c# json asp.net-mvc

我有一个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;
        });
}

2 个答案:

答案 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\"}"