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