将字典作为JSON返回并使用JS函数成功访问它的内容 - C#
问题描述:
我有一个Dictionary
名为finalDictionary
,它是通过合并多个字典创建的。 这是一段代码,我用它来创建此词典:将字典作为JSON返回并使用JS函数成功访问它的内容 - C#
Dictionary<string, Dictionary<DateTime, int>> finalDictionary= new Dictionary<string, Dictionary<DateTime, int>>();
finalDictionary.Add("Data1", listData1.ToDictionary(x => x.Date, y => y.Value));
finalDictionary.Add("Data2", listData2.ToDictionary(x => x.Date, y => y.Value));
finalDictionary.Add("Data3", listData3.ToDictionary(x => x.Date, y => y.Value));
注:listData1
,listData2
和listData3
是哪个,我转换成字典在上面的代码中所有的匿名名单。
下面是这些字典的样本格式:(让我们考虑Data1
)
Key : 'Data1'
Value :
[0] {[6/14/2015 12:00:00 AM, 1]}
[1] {[6/21/2015 12:00:00 AM, 0]}
[2] {[6/28/2015 12:00:00 AM, 0]}
[3] {[7/5/2015 12:00:00 AM, 0]}
[4] {[7/12/2015 12:00:00 AM, 0]}
[5] {[7/19/2015 12:00:00 AM, 0]}
[6] {[7/26/2015 12:00:00 AM, 0]}
因此,每个上面的日期是再次Key
一部分,这些数字Value
一部分。
我回到这个字典即finalDictionary
的JSON结果从我控制器方法如下:
return Json(new { Result = "OK", Records = obj.GetDetails()}, JsonRequestBehavior.AllowGet);
但是,当这种返回到我的调用JS阿贾克斯失败抛出下面的内部服务器500错误:
jqXHR = {readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}, textStatus = "error", errorThrown = "Internal Server Error //and so on
这里是我的JS代码:
function loadDetails() {
$.ajax({
type: 'GET',
dataType: 'json',
contentType: "application/json; charset=utf-8",
cache: false,
url: _WebRoot() + '/Charts/GetDetails',
success: function (response, textStatus, jqXHR) {
prepareData(response.Records, 'Text Title');
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Error - ' + errorThrown);
}
});
}
需要进行哪些修改才能使其工作?
注:我收到上面提到的错误的数据从控制器返回并到达JS方法
答
转换的“按键”数据类型(“日期”在我的情况)元件后字符串解决了问题。 最初“日期”为日期时间数据类型。
因此,当我从控制器返回我的上述字典作为JSONResult JS方法抛出一个错误,因为它无法字符串化或序列化此字典。
因此建议改变你的字典的键“”元素的数据类型为字符串或它们设置为对象。
这里的错误消息我是能够调试出(提供此错误消息,因为它可能会帮助谁可能面临这样的类似问题的其他的):
Unhandled Exception: System.ArgumentException: Type 'System.Collections.Generic. Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[ChatData, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' is not supported for serialization/deserialization of a dictionary, keys must be strings or objects.
也许我偷懒不读代码,但可能有助于因为http状态码500可能是任何东西(引发异常),所以在C#中获得一些实际异常的日志记录。要么或者共享更多的控制器代码,以便我们可以尝试找出它抛出异常的位置。 –
从C#方面来看,没有任何异常,因为字典确实从控制器返回而没有任何错误。我想我正在做一些错误,无论是在返回的JSON格式或我的JS代码端的错误。 –
500错误肯定来自服务器(内部*服务器*错误) - 所以'/等等'部分是你看诊断它。 – James