Я создаю свой 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 через следующую функцию.