2010-11-23 2 views
4

나는 이미 존재하는 JsonResult (다른 메서드에서 반환 됨)에 몇 가지 추가 정보를 추가하여 Controller에서 JsonResult를 생성합니다. 더 속성을 추가하기 위해, 나는 사전에 초기 JsonResult 변환 : Dictionary <string, Object>를 JsonResult로 반환하고 JavaScript에서 적절한 결과를 얻으려면 어떻게해야합니까?

IDictionary<string, object> wrapper = (IDictionary<string, object>)new 
    System.Web.Routing.RouteValueDictionary(json.Data); 

그럼 난 그냥 wrapper["..."] = "value"를 작성하여 데이터를 추가합니다.

new JsonResult() { wrapper, JsonRequestBehavior.AllowGet }; 

을하고 문제가 시작 곳이다;

방법은 .DATA로 래퍼로, 새로운 JsonResult을 반환 통신이 완벽하게 발생하고 success 함수가 호출되면 JavaScript에서 사용하는 결과 배열에 예상대로 정리 구조가 없습니다. val = ret.PropName1;으로 값에 액세스하는 대신 간단한 인덱스 배열에 액세스해야합니다. 두 쌍의 사전을 켭니다 : { "Value"="val, "Key"="PropName1" }; (그래서 뭔가가 o[0].Key 같이 나에게 속성 이름을 줄 것입니다)

내가 좋은 방법 보기에서 사전 정리. 몇 가지 아이디어가 있지만 특히 깨끗한 것은 아닙니다. JsonResult 재사용을 서버 측에서 버리고 모든 올바른 속성을 가진 익명 개체를 만들 수 있습니다. 또는 결과를 새 Array()로 변환 할 수있는 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

관련 문제