【问题标题】:Receiving arbitrary JSON object in MVC method在 MVC 方法中接收任意 JSON 对象
【发布时间】:2017-04-21 16:50:31
【问题描述】:

我有一个像这样的 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;
        });
}

【问题讨论】:

  • 只接受字符串,稍后再转换,那么可以接受任何Json字符串吗?
  • 仅将数据设置为字符串属性无法捕获值。它始终为空。
  • 不是整个方法输入的数据,如 SaveData(string jsonstring)
  • @Krishna 尝试将输入参数更改为字符串 public ActionResult SaveData(string request),但当我这样做时,请求始终为 null
  • @JensB:这就是为什么这是评论而不是答案;)

标签: c# json asp.net-mvc


【解决方案1】:

在服务器端,DTO 类必须与有效负载携带的相同属性名称匹配。

public class DataObject
{
    public string test { get; set; } // <-----
}

因此,您的保存方法保持不变:

[HttpPost]
public ActionResult SaveData(DataObject request) {}

payload 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
}

【讨论】:

    【解决方案2】:

    通过在客户端将数据转换为 JSON 字符串,我能够将其发送到字符串属性,从而能够对所有对象使用相同的类型化视图。

    我最终在保存对象时这样做了(我在前端使用 angular),将 Json 对象转换为字符串。

    entry.Data = angular.toJson(entryData.Data, false);
    

    然后,当从 MVC 中获取 json 字符串时,我这样做是为了将其恢复为真正的 javascript 对象。

    entry.Data = angular.fromJson(entry.Data);
    

    如果不先将 JSON 对象转换为 json 字符串,MVC 不会接受 JSON 对象到 text 属性中。

    使用上述方法,我将这样的数据存储在我的数据库中:

    "{\"Value\":123,\"Currency\":\"EUR\"}"
    

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2017-09-08
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多