我正在使用jQuery的getJSON函数从 Controller 页面返回JsonResult。

这是网页中的jQuery代码:

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

这是 Controller 代码:
    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 类具有许多属性和方法。

谁能指出我正确的方向?

最佳答案

我怀疑您的WorkFlowAssignment模型具有一些无法通过JSON序列化的循环引用。我建议您使用 View 模型并中断所有可能的循环引用。使用 View 模型的另一个优点是,您将仅将其实际需要的属性发送给客户端以进行处理。您不需要通过电线转移客户将不需要的一些复杂的东西。因此,例如,如果您的客户所需的一切都是IDWorkFlowName,请执行以下操作:

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请求失败时,作为开发人员的第一反应应该是启动调试工具,并确切查看正在发送的请求/响应。

09-17 02:00