Ajax-Call для получения результата JSON от контроллера (возвращающего IList) в Asp.Net MVC всегда выдает ошибки - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь сделать AJAX-вызов (Javascript), чтобы создать IList, созданный в методе Controller.

index.js:

function getList() {
    $.ajax({
        url: myUrl, 
        type: "GET",
        dataType: "json",    
        success: function (response) {
            if (response) {
                //do sth
            }
        },
        error: function (response) {   
            alert("error");  //always error
            console.log(response); //object with just default functions
        }
   });

}

MyController.cs:

 public IList<SomeItem> loadList()
 {
        var items = db.SomeItemSet.Include(item => item.Sth).ToList();

        IList<SomeItem> resultList = new List<SomeItem>();

        for (int i = 0; i < items.Count(); i++)
        {
            //if(condition)
               resultList.Add(items[i]);                  
        }
        return resultList;
}

public JsonResult loadListJson()
{
    return Json(new { response = loadList() }, JsonRequestBehavior.AllowGet);
}

Точка останова в методе Controller показывает мне, что он выполняется. Список не является нулевым.

Я также пытался объявить метод как результат действия (вернуть json без jsonreqbehaviour) и выполнить тип: POST в вызове ajax. Как вы думаете, что может потерпеть неудачу здесь?

Панель отладки сети показывает код

302: найдено

(но не 200: ОК) при попытке загрузить ListJson.

Исключение:

System.InvalidOperationException: обнаружена циклическая ссылка при сериализации объекта типа 'System.Data.Entity.DynamicProxies.SomeItem_9D ..'. в System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal (Объект o, StringBuilder sb, глубина Int32, объекты HashtableInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
в ...

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я использовал Newtonsoft.Json.JsonConvert, чтобы преобразовать мой список!

index.js:

function getList() {
    $.ajax({
        url: myUrl, 
        type: "POST", //
        dataType: "json",    
    success: function (list) {
        if (list) {
            //do sth 
        }
    },
    error: function (response) { //do sth }
   });
}

MyController.cs:

 public ActionResult loadListJson()
        {
            return Content(Newtonsoft.Json.JsonConvert.SerializeObject(loadList()), "application/json");
        }
0 голосов
/ 07 ноября 2018

Кажется, что в структуре вашего объекта есть циклические ссылки. Он не поддерживается сериализатором JSON. Попробуйте Select() метод. Нечто вроде ниже.

 var items = db.SomeItemSet.Include(item => item.Sth).Select(s=> new SomeItemDto{
 // which properties you need
}).ToList();
...