2010-11-23 1 views
4

Я строю свой JsonResult в контроллере, добавив дополнительную информацию в уже существующий JsonResult (возвращенный с помощью другого метода). Для того, чтобы добавить больше свойств, я преобразовал первоначальный JsonResult в словарь:Как я могу вернуть словарь <string, Object> как JsonResult, и получить правильный результат в JavaScript?

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, которая могла бы перевести результат в новый массив(). Я ищу лучшие решения.

[Редактировать позже] Массив поступает так, как это делается, потому что словарь был определен как <string, object>. Если бы это было <string, string>, оно было бы отправлено так, как я этого ожидал. Но поскольку я фактически использую объекты из этого мешка, я просто оставлю это так, как он есть, и передам json-ответ через следующую функцию.

ответ

1

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

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; 
    } 

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

+0

принято обходное решение, в конце концов; не было лучшего решения. – Liz 2012-03-13 12:51:13

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