2014-10-30 3 views
0

JsonResult을 확장 중이며 그 안에 Data 속성에 속성을 추가해야합니다.JavaScriptSerializer에서 사용할 익명 형식에 속성 추가

public override void ExecuteResult(ControllerContext context) 
{ 
    // error checking removed for brevity 

    this.Data = AppendSomehow(
        this.Data, // = new { hello = "hi" } 
        new { goodbye = "bye" }); 

    base.ExecuteResult(context); // calls javaScriptSerializer.Serialize(this.Data) 
} 

하나의 옵션으로 변환하는 것입니다 IDictionary<string, object> :

private static object AppendSomehow(object data, object additional) 
{ 
    var originalDictionary = new RouteValueDictionary(original); 
    var additionalDictionary = new RouteValueDictionary(additional); 

    foreach (var kv in additionalDictionary) 
     originalDictionary.Add(kv.Key, kv.Value); 

    return originalDictionary; 
} 

하지만 JavaScriptSerializer 통과 때와 같이이 나올 것입니다 : 원하는 결과가

[{"Key":"hello","Value":"hi"},{"Key":"goodbye","Value":"bye"}] 

때 :

{"hello":"hi","goodbye":"bye"} 

How to flatten an ExpandoObject returned via JsonResult in asp.net mvc?에 게시 된 솔루션을 사용하도록 base.ExecuteResult(ControllerContext) 구현을 복사하여 붙여 넣을 수는 있지만 구현이 이미 존재할 때 약간 더러워 보입니다.

답변

0

IDictionary<string, object> 경로를 아래로 내려가는 것은 실제로 JavaScriptSerializer으로가는 좋은 방법은 실제로 Dictionary<string, object>을 올바르게 직렬화합니다. 따라서 당신이해야 할 일은 IDictionary<string, object>을 가져다가 새로운 콘크리트 Dictionary<string, object>을 인스턴스화하는 것입니다.

private static object AppendSomehow(object data, object additional) 
{ 
    var originalDictionary = new RouteValueDictionary(original); 
    var additionalDictionary = new RouteValueDictionary(additional); 

    foreach (var kv in additionalDictionary) 
     originalDictionary.Add(kv.Key, kv.Value); 

    return new Dictionary<string, object>(originalDictionary); 
} 
관련 문제