返回 JsonResult 导致 500 内部服务器错误
Posted
技术标签:
【中文标题】返回 JsonResult 导致 500 内部服务器错误【英文标题】:Returning JsonResult results in 500 Internal Server Error 【发布时间】:2011-12-23 01:01:17 【问题描述】:我正在使用 jQuery 的 getJSON 函数从我的控制器返回 JsonResult
。
jQuery
>$.getJSON("/Test/GetJsonWFA", null, function (data)
$(data).each(function ()
alert("call succeeded");
//alert(data);
);
);
控制器
public JsonResult GetJsonWFA()
List<WorkFlowAssignment> listWFAs = new List<WorkFlowAssignment>();
listWFAs.Add(new WorkFlowAssignment()
ID = 1,
WorkFlowName = "WorkFlowName1"
);
listWFAs.Add(new WorkFlowAssignment()
ID = 2,
WorkFlowName = "WorkFlowName2"
);
return Json(listWFAs, JsonRequestBehavior.AllowGet);
我收到以下错误:500 Internal Server Error。
如果我将 GetJsonWFA 中的 WorkFlowAssignment 替换为一个普通的类,一切正常。
似乎与列表中对象的类型有关。
WorkFlowAssignment 类有很多属性和方法。
谁能指出我正确的方向?
【问题讨论】:
500 内部服务器错误 - 表明GetJsonWFA
功能失败 - 您尝试过单步执行该功能吗?
启动 Chrome 的开发者工具并查看 500 个内容。这应该包括一个堆栈跟踪。
@ipr101 - 该函数在单步执行时工作正常 - 在尝试按摩列表以返回 JsonResult 时,该方法似乎失败了。
【参考方案1】:
我怀疑您的 WorkFlowAssignment
模型有一些无法被 JSON 序列化的循环引用。我建议您使用视图模型并打破任何可能的循环引用。使用视图模型的另一个优点是您将只向客户端发送它实际需要的属性以进行处理。您不需要通过网络传输客户永远不需要的一些复杂的东西。因此,例如,如果您的客户需要的一切都是 ID
和 WorkFlowName
,请执行以下操作:
public ActionResult GetJsonWFA()
List<WorkFlowAssignment> listWFAs = ...
var viewModel = listWFAs.Select(x => new
ID = x.ID,
WorkFlowName = x.WorkFlowName
);
return Json(viewModel, JsonRequestBehavior.AllowGet);
在客户端:
$.getJSON("/Test/GetJsonWFA", null, function (data)
$.each(data, function (index, item)
alert('ID = ' + item.ID + ', WorkFlowName = ' + item.WorkFlowName);
);
);
您还应该使用诸如 FireBug 或 Developer Toolbar 之类的调试工具来检查浏览器发送的 AJAX 请求并分析服务器响应以发现最终错误。当 AJAX 请求失败时,作为开发人员,您的第一反应应该是启动调试工具并准确查看正在发送的请求/响应。
【讨论】:
感谢 Darin - 我在 Firebug 的 XHR 选项卡中看到了 500 服务器错误。但我明白你对视图模型的看法,并会尝试一下。 感谢@Darin - 调整了视图模型对象,使它们更简单,它就像一个魅力。以上是关于返回 JsonResult 导致 500 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章