2011-11-06 129 views
3

我正在使用jQuery的getJSON函数从我的控制器页面返回一个JsonResult。返回JsonResult结果500内部服务器错误

下面是网页中的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内部服务器错误

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

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

WorkFlowAssignment类有许多属性和方法。

任何人都可以指向正确的方向吗?

+0

500内部服务器错误 - 会提示'GetJsonWFA'功能失败 - 您是否试过单步执行功能? – ipr101

+0

启动Chrome的开发人员工具,并在发生500个内容时查看。这应该包括堆栈跟踪。 – xanadont

+0

@ ipr101 - 在逐步完成时,函数可以正常工作 - 当试图按下列表以返回JsonResult时,该方法似乎失败。 –

回答

11

我怀疑你的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); 
} 

,并在客户端上:

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

你也应该使用调试工具,如萤火虫或开发者工具栏检查您的浏览器发送的AJAX请求并分析服务器响应以确定最终的错误。当AJAX请求失败时,作为开发人员的第一反应应该是启动您的调试工具并确切地查看正在发送的请求/响应。

+0

感谢Darin--这是我看到500 Server Error的地方 - 在Firebug的XHR选项卡中。但是,我明白了关于视图模型的观点,并会试一试。 –

+0

谢谢@Darin - 调整视图模型对象,使它们更简单,它像魅力一样工作。 –

相关问题