web-dev-qa-db-fra.com

Renvoyer JsonResult avec la liste des objets du contrôleur MVC

J'ai une méthode simple dans mon contrôleur MVC:

[HttpPost]
public JsonResult GetAreasForCompany(int companyId)
{
   var areas = context.Areas.Where(x => x.Company.CompanyId == companyId).ToList();
   return Json(areas);
}

Il s'agit d'un objet de zone:

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; }
}

Et voici comment j'appelle la méthode depuis la vue:

$.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;
    }
});

J'ai vérifié la méthode dans le contrôleur et une liste d'objets Area est créée. Auriez-vous une idée de la raison pour laquelle j'obtiens l'erreur de serveur interne 500 lorsque la méthode est appelée à partir de la vue? Lorsque je retourne autre chose (comme un objet Dictionary), tout fonctionne bien, c'est juste lorsque je vise à convertir la liste des zones en Json que j'obtiens une erreur.

17
Bartosz

Puisque la classe Area contient Company et Company contient une collection de Area, vous avez probablement des références circulaires dans votre hiérarchie d'objets qui ne sont pas prises en charge par le sérialiseur JSON. Pour résoudre ce problème, renvoyez les objets anonymes avec uniquement les propriétés dont vous avez besoin, par exemple

[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

Renvoyer l'objet de liste en tant que Json (également utile pour JqueryUI et la méthode 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