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

本文关键字:对象 列表 JsonResult 返回 MVC 控制器 | 更新日期: 2023-09-27 18:18:45

我有一个简单的方法在我的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;
    }
});

我已经检查了控制器中的方法,并创建了一个Area对象列表。你会有任何想法,为什么我得到500内部服务器错误时,从视图调用方法?当我返回其他任何东西(如Dictionary对象)时,一切都很好,只是当我打算将区域列表转换为Json时,我得到了一个错误。

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

由于类Area包含CompanyCompany包含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方法)

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