web-dev-qa-db-ja.com

MVCコントローラーからオブジェクトのリストを含むJsonResultを返す

私の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に変換しようとすると、エラーが発生します。

17
Bartosz

クラス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);
}
20
user3559349

List Objectを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);
}
3
user4584103