在MVC方法中接收任意JSON对象



我有这样的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"}"

最新更新