从 MVC 控制器返回带有对象列表的 JsonResult
Posted
技术标签:
【中文标题】从 MVC 控制器返回带有对象列表的 JsonResult【英文标题】:Return JsonResult with List of objects from MVC controller 【发布时间】:2014-10-13 16:52:47 【问题描述】:我的 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 时,我得到了一个错误。
【问题讨论】:
Company
是否恰好包含Area
的集合?
是的,公司有收藏区
好的,很可能是循环引用问题。您实际上需要在结果中返回Area
的哪些属性?
标题和区域 ID。然后我应该只使用这两个属性创建匿名对象吗?
完全正确 - .Select(a => new ....
(它的好处是减少了负载)
【参考方案1】:
由于类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);
【讨论】:
抱歉问了一个不相关的问题,但为什么你要在这里使用HttpPost
而不是HttpGet
?
@AaronCampbell,没有理由您需要使用[HttpPost]
,因为它不会更改任何数据 - 也可以是[HttpGet]
(除非您不希望将 url 添加到浏览器历史记录中)。刚刚使用了OP所拥有的:)【参考方案2】:
以 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);
【讨论】:
以上是关于从 MVC 控制器返回带有对象列表的 JsonResult的主要内容,如果未能解决你的问题,请参考以下文章
C# MVC 4 RAZOR - JSON 使用 @foreach 从控制器返回列表到视图
如何从返回包含对象的对象的控制器测试spring mvc模型属性