我的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时,我得到一个错误。
答案 0 :(得分:18)
由于类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);
}
答案 1 :(得分:3)
将列表对象作为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);
}