Как я могу вернуть словарькак JsonResult, и получить правильный результат в JavaScript? - PullRequest
4 голосов
/ 23 ноября 2010

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

1 Ответ

1 голос
/ 23 ноября 2010

Добавление: во время написания вышеуказанного вопроса мне пришло в голову, что перевод между «плохим» массивом и «хорошим» массивом действительно очень прост:

    function translateAjaxResult(ret) {
        var result = new Array();

        if (ret == null) return result;
        for(var i = 0; i < ret.length; i++)
            result[ret[i].Key] = ret[i].Value;
        return result;
    }

Тем не менее, это все еще исправление проблемы, а не исправление проблемы, поэтому я все еще хотел бы более элегантное решение.

...