принятый обходной путь, в конце концов; лучшего решения не было.
даю свой JsonResult в Controller, добавляя некоторую дополнительную информацию к уже существующему JsonResult (возвращенному из другого метода). Чтобы добавить больше свойств, я преобразовал исходный JsonResult в словарь:
IDictionary<string, object> wrapper = (IDictionary<string, object>)new
System.Web.Routing.RouteValueDictionary(json.Data);
Тогда я просто добавляю данные, написавwrapper["..."] = "value"
.
Метод возвращает новый JsonResult, с оберткой в виде .Data:
new JsonResult() { wrapper, JsonRequestBehavior.AllowGet };
и вот тут начинаются неприятности; в то время как общение происходит идеально, и вызывается функция успеха, результирующий массив, который я использую в JavaScript, не имеет ожидаемой чистой структуры: вместо доступа к значениямval = ret.PropName1;
Я заканчиваю тем, что получаю доступ к простому индексированному массиву, который содержит в свою очередь словарь с двумя парами:{ "Value"="val, "Key"="PropName1" };
(так что-то вродеo[0].Key
дал бы мне имя собственности)
Я хотел бы знать, есть ли умный, быстрый способ переписать создание JsonResult в контроллере, чтобы получить хороший чистый словарь в представлении. У меня есть пара идей, но они не особо чисты: я могу отбросить повторное использование JsonResult на стороне сервера и просто создать анонимный объект со всеми правильными свойствами; или я мог бы сделать функцию перевода в Javascript, которая могла бы преобразовать результат в новый Array (). Я ищу лучшие решения.
[Позднее редактировать] Массив приходит так, как он есть, потому что словарь был определен как<string, object>
, Если бы<string, string>
, это будет отправлено так, как я ожидал. Но так как я на самом деле использую объекты из этой сумки, я просто оставлю все как есть и передам ответ json через функцию ниже.