C# 从MVC控制器返回JsonResult和对象列表

C# 从MVC控制器返回JsonResult和对象列表,c#,jquery,ajax,asp.net-mvc,json,C#,Jquery,Ajax,Asp.net Mvc,Json,我的MVC控制器中有一个简单的方法: [HttpPost] public JsonResult GetAreasForCompany(int companyId) { var areas = context.Areas.Where(x => x.Company.CompanyId == companyId).ToList(); return Json(areas); } 这是一个面积对象: public class Area { public int AreaId {

我的MVC控制器中有一个简单的方法:

[HttpPost]
public JsonResult GetAreasForCompany(int companyId)
{
   var areas = context.Areas.Where(x => x.Company.CompanyId == companyId).ToList();
   return Json(areas);
}
这是一个面积对象:

public class Area
{
    public int AreaId { get; set; }

    [Required]
    public string Title { get; set; }
    public bool Archive { get; set; }

    public virtual Company Company { get; set; }
}
下面是我如何从视图调用该方法的:

$.ajax({
    url: '@Url.Action("GetAreasForCompany")',
    type: 'POST',
    async: false,
    data: "{'companyId': " + companyId + "}",
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    error: function () {
        alert("Server access failure!");
    },
    success: function (result) {
        response = result;
    }
});

我已经检查了控制器中的方法,并创建了一个区域对象列表。您知道为什么从视图调用该方法时会出现500内部服务器错误吗?当我返回任何其他内容(如Dictionary对象)时,一切正常,就在我打算将区域列表转换为Json时,我遇到了一个错误。

因为类
Area
包含
Company
并且
Company
包含
Area
的集合,所以在对象层次结构中可能有Json序列化程序不支持的循环引用。要解决此问题,请仅返回具有所需属性的匿名对象,例如

[HttpPost]
public JsonResult GetAreasForCompany(int companyId)
{
  var areas = context.Areas
    .Where(x => x.Company.CompanyId == companyId)
    .Select(a => new
    {
      AreaId = a.AreaId,
      Title = a.Title
    });
  return Json(areas);
}

以Json形式返回列表对象(对于JqueryUI和Linq方法也很有用)


公司
是否碰巧包含一个
区域的集合
?是的,该公司有一个区域集合OK,这是它最可能的循环参考问题。您实际需要在结果中返回
区域的哪些属性?标题和区域ID。然后我是否应该创建仅具有这两个属性的匿名对象?准确地说-
。选择(a=>new…
(它有减少有效负载的好处)抱歉,有一个不相关的问题,但是为什么您要在此处使用
HttpPost
而不是
HttpGet
?@AaronCampbell,您没有理由需要使用
[HttpPost]
因为它不会更改任何数据-也可以是
[HttpGet]
(除非您不想将url添加到浏览器历史记录中)。只需使用OP拥有的内容:)
public ActionResult GetItemList()
{
    var search = Request.Params["term"];

    var itemList = (from items in db.TblItems where items.ItemName.StartsWith(search) select new { label = items.ItemName, value = items.ItemName }).ToList();

    return Json(itemList, JsonRequestBehavior.AllowGet);
}