4

我通过向已经存在的 JsonResult(从不同的方法返回)添加一些额外的信息来在 Controller 中构建我的 JsonResult。为了添加更多属性,我将初始的 JsonResult 转换为 Dictionary:

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 中创建一个翻译函数,将结果翻译成一个新的 Array()。我正在寻找更好的解决方案。

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

4

1 回答 1

1

附录:在写上面的问题时,我突然想到'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;
    }

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

于 2010-11-23T13:26:28.130 回答