代码之家  ›  专栏  ›  技术社区  ›  Liz

如何将Dictionary<string,Object>作为JsonResult返回,并在JavaScript中获得正确的结果?

  •  4
  • Liz  · 技术社区  · 14 年前

    我在控制器中构造JSOREST结果,将一些额外的信息添加到已经存在的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 };
    

    这就是问题的开始;虽然通信进行得很好,调用了success函数,但我在JavaScript中使用的结果数组没有我所期望的干净结构:而不是访问 val = ret.PropName1; 我最终不得不访问一个简单的索引数组,它依次包含一个有两对的字典: { "Value"="val, "Key"="PropName1" }; (所以有点像 o[0].Key 会给我物业名称)

    我想知道是否有一种聪明、快速的方法来重写控制器中的JsonResult创建,在视图中获得一个干净的字典。 我有两个想法,但不是特别清楚:我可以在服务器端放弃JsonResult重用,只需创建一个具有所有正确属性的匿名对象;或者,我可以用Javascript创建一个转换函数,将结果转换为一个新的数组()。我在寻找更好的解决方案。

    [以后编辑] 因为字典定义为 <string, object> . 如果是的话 <string, string> ,它将按我原先期望的方式发送。但由于我实际使用了那个包中的对象,所以我将保持原样,并通过下面的函数传递json响应。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Liz    14 年前

    补遗:在写上述问题时,我突然想到“bad”数组和“good”数组之间的转换确实非常简单:

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

    尽管如此,它仍然是一个问题的补丁,而不是一个问题的解决方案,所以我仍然希望有一个更优雅的解决方案。