【问题标题】:How can I return a Dictionary<string, Object> as JsonResult, AND get the proper result in JavaScript?如何将 Dictionary<string, Object> 作为 JsonResult 返回,并在 JavaScript 中获得正确的结果?
【发布时间】:2011-05-14 11:15:27
【问题描述】:

我通过向已经存在的 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 这样的东西会给我属性名称)

我想知道是否有一种智能、快速的方法来重写 Controller 中的 JsonResult 创建,从而在 View 中获得一个干净整洁的字典。 我有几个想法,但不是特别干净:我可以丢弃服务器端的 JsonResult 重用,只创建一个具有所有正确属性的匿名对象;或者,我可以在 Javascript 中创建一个翻译函数,将结果翻译成一个新的 Array()。我正在寻找更好的解决方案。

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

【问题讨论】:

    标签: arrays json asp.net-mvc translate jsonresult


    【解决方案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;
        }
    

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

    【讨论】:

    • 最终接受了解决方法;没有更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 2018-09-15
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多