【问题标题】:Return JsonResult with List of objects from MVC controller从 MVC 控制器返回带有对象列表的 JsonResult
【发布时间】: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 ....(它的好处是减少了负载)

标签: c# jquery ajax asp.net-mvc json


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2017-06-29
    • 2017-01-17
    • 2013-02-01
    相关资源
    最近更新 更多