2014-10-30 52 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"} 

我可以複製粘貼base.ExecuteResult(ControllerContext)實現並修改它以使用在How to flatten an ExpandoObject returned via JsonResult in asp.net mvc?中發佈的解決方案,但是當實現已經存在時,看起來有點髒。

回答

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