在ASP.NET MVC控制器中接收嵌套的匿名对象

时间:2015-06-10 18:27:26

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

我需要一个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)
        {
            ....
        }

1 个答案:

答案 0 :(得分:1)

new_nums = [item1 for item1, item2 in zip(nums, nums[1:]) if item1 != item2] new_nums.append(nums[-1]) 使用的JsonValueProvider似乎在这种情况下以奇怪的方式处理数组(基于源here),所以即使是DefaultModelBinder也是如此最有可能出现这个问题。 (不要以为你会在MVC 6中遇到这个问题)

但是,直接调用dynamic(默认提供商使用的内容足够有趣)会产生您之后的结果:

JavascriptSerializer

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

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

否则,您可以像在此处提出的那样实现自定义// wrapping the JSON object in quotes to stringify it { 'fields' : "{ 'TotalFloors': '9', 'HouseNumber': .... }" } https://json.codeplex.com/discussions/347099

自定义价值提供商可能是更清洁的解决方案。