返回JsonResult会导致500内部服务器错误

Der*_*ell 5 javascript asp.net-mvc jquery json

我正在使用jQuery的getJSON函数从我的控制器页面返回一个JsonResult.

这是网页中的jQuery代码:

    $.getJSON("/Test/GetJsonWFA", null, function (data) {
        $(data).each(function () {
            alert("call succeeded");
            //alert(data);
        });
Run Code Online (Sandbox Code Playgroud)

这是控制器代码:

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

    }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:500内部服务器错误.

如果我更换WorkFlowAssignmentGetJsonWFA用一个简单的类一切正常.

它似乎与列表中的对象类型有关.

WorkFlowAssignment类有许多属性和方法.

谁能指出我正确的方向?

Dar*_*rov 13

我怀疑你的WorkFlowAssignment模型有一些循环引用,不能被JSON序列化.我建议你使用视图模型并打破任何可能的循环引用.使用视图模型的另一个优点是,您只需向客户端发送实际需要的属性即可进行处理.您无需通过线路传输客户端永远不需要的一些复杂内容.因此,举例来说,如果您的客户端所需要的一切就是IDWorkFlowName这样做:

public ActionResult GetJsonWFA() {
    List<WorkFlowAssignment> listWFAs = ... 

    var viewModel = listWFAs.Select(x => new {
        ID = x.ID,
        WorkFlowName = x.WorkFlowName
    });
    return Json(viewModel, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

在客户端:

$.getJSON("/Test/GetJsonWFA", null, function (data) {
    $.each(data, function (index, item) {
        alert('ID = ' + item.ID + ', WorkFlowName = ' + item.WorkFlowName);
    });
});
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用调试工具(如FireBug或Developer Toolbar)来检查浏览器发送的AJAX请求,并分析服务器响应以查找最终错误.当AJAX请求失败时,您作为开发人员的第一反应应该是启动调试工具并确切地查看正在发送的请求/响应.