我的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对象)时,一切正常,只是当我打算将Areas列表转换为Json时,我得到一个错误。
由于类Area包含Company和Company包含的集合,因此Area您的对象层次结构中可能具有循环引用,而JSON序列化器不支持循环引用。要解决此问题,请仅返回具有所需属性的匿名对象,例如
Area
Company
[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); }