【问题标题】:Receive nested anonymous objects in ASP.NET MVC controller在 ASP.NET MVC 控制器中接收嵌套的匿名对象
【发布时间】:2015-06-11 12:55:42
【问题描述】:

我需要一个 ASP.NET MVC 控制器,它以 JSON 格式从 JS 接收匿名对象,以遍历其属性。我曾经这样做,收到Dictionary<string, object>。但是现在其中一个值是Array,并且是

receivedDictionary[Photos] = [object, object, object]

它得到它

receivedDictionary[Photos[0]] = object, receivedDictionary[Photos[1]] = object, receivedDictionary[Photos[2]] = object

我没有得到一个 key = Photos 和 value = array 的字典条目,而是许多 key = Photos[x] 和 value = object 的条目。

如何将它作为字典中的一个条目获取,或者有没有更好的方法将其作为动态匿名对象获取并像在 JS 中一样遍历其属性?

UPD:JSON 看起来像这样:

{"fields":{"TotalFloors":"9","HouseNumber":"10","Photos":[{"id":0,"ParentID":0,"OriginalUrl":"py4s1y3uyqu","OriginalExt":".jpg","ThumbUrl":"2hn04w2lzuu","FormatUrls":{"WH_109_82_Url":"4cwjarqudvo","WH_766_454_Url":"oofm5qo21rr"}},{"id":0,"ParentID":0,"OriginalUrl":"t3csgq20iro","OriginalExt":".jpg","ThumbUrl":"j1uwwburmse","FormatUrls":{"WH_109_82_Url":"gm4qoery1u2","WH_766_454_Url":"a3c20re3g1d"}}],"Details":"Other details"}}

控制器定义:

        [HttpPut]
        public ActionResult restId(string className, int id, Dictionary<string, object> fields)
        {
            ....
        }

【问题讨论】:

  • JSON 是什么样的?以及创建 JSON 的代码?你能控制那段代码吗?
  • 你能发布 JSON 的实际 sn-p 吗?
  • 是的,我确实可以控制客户端代码。
  • 也许dynamic 类型适合您?匿名类型仍然需要编译时类型安全,如果输入在结构上未知,则无法提供。也许你可以在这里描述更多关于用例的信息?
  • 大卫,也许,以及如何使用反射迭代动态的属性?多说一句,我可以补充一点,创建此控制器是为了使用反射编辑任何类网站模型的对象。这个特定的控制器正在获取输入并使用输入的键通过反射查看类属性,并根据属性的类型决定如何处理输入的值

标签: c# asp.net asp.net-mvc


【解决方案1】:

DefaultModelBinder 使用的 JsonValueProvider 在这种情况下似乎以一种奇怪的方式处理数组(基于源 here),因此即使是 dynamic 也很可能会出现问题。 (但不要认为在 MVC 6 中会遇到这个问题)

但是,直接调用 JavascriptSerializer(这很有趣,这是默认提供程序使用的)会产生您所追求的结果:

var js = new JavaScriptSerializer();
var res = js.DeserializeObject(@"{'TotalFloors':'9','HouseNumber':'10','Photos':[...],'Details':'Other details'}");

要解决您的问题,您可以将参数更改为字符串并在您的操作中运行上述代码(显然用参数替换 JSON 字符串),这意味着您从前端提交的 JSON 需要看起来更像:

// wrapping the JSON object in quotes to stringify it
{ 'fields' : "{ 'TotalFloors': '9', 'HouseNumber': .... }" } 

否则,您可以像这里建议的那样实现自定义JsonValueProviderhttps://json.codeplex.com/discussions/347099

自定义值提供者可能是更简洁的解决方案。

【讨论】:

  • 你怎么可能知道这个?我的意思是,如果你直接打电话,你会得到需要的结果。这就是我所希望的答案。谢谢,我现在将 JSON 作为字符串传递并反序列化您描述的方式。干杯;)
  • 再次感谢,伙计,一切正常,我自己永远也想不通。
  • 很高兴我能帮上忙 :) 称其为侥幸;我尝试的第一件事是直接使用序列化程序进行复制,并返回所需的结果。所以我对价值提供者做了更多的挖掘,并找到了我链接到的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多