2015-06-10 1 views
0

Мне нужен ASP.NET MVC-контроллер, который получает анонимный объект от JS в JSON для итерации по его свойствам. Я делал это, получая Dictionary<string, object>. Но теперь один из значений Array и InstEd изПолучать вложенные анонимные объекты в ASP.NET MVC-контроллере

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

он получает как

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

я не один словарной с ключевыми = Фотографии и значение = массив, но многие записи с ключом = Фотографии [x] и значение = объект.

Как я могу получить его как одну запись в словаре или есть ли лучший способ получить ее как динамический анонимный объект и перебрать ее свойства так же, как в 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

Как выглядит JSON? И код, который создает JSON? У вас есть контроль над этим кодом? –

+0

Можете ли вы опубликовать фактический фрагмент JSON? – kaveman

+0

Да, у меня есть контроль над кодом на стороне клиента. – Roman

ответ

1

JsonValueProvider используется DefaultModelBinder, кажется, обработки массива в нечетной моды в этом случае (на основе источник 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': .... }" } 

В противном случае вы можете реализовать пользовательский JsonValueProvider, как и тот, который предлагается здесь: https://json.codeplex.com/discussions/347099

Поставщик настраиваемых цен, вероятно, является самым чистым решением.

+0

Как вы могли это знать? Я имею в виду, что если вы позвоните напрямую, вы получите необходимый результат. Это тот ответ, на который я надеялся. Спасибо, я передам JSON как строку сейчас и десериализую, как вы описали. Cheers;) – Roman

+0

Еще раз спасибо, человек, все отлично работает, я никогда не узнаю это сам. – Roman

+0

Рад, что я мог помочь :) Назовите это случайностью; Первое, что я пытался сделать, - это реплицировать с помощью сериализатора напрямую, и это вернуло желаемые результаты. Поэтому я немного поработал в ценностном провайдере и нашел код, с которым я связан. –

Смежные вопросы