Циклическая ссылка была обнаружена при сериализации объекта типа ‘System.Data.Entity.DynamicProxies.Элемент

#c# #ajax #asp.net-mvc

#c# #ajax #asp.net-mvc

Вопрос:

Я пытаюсь выполнить простой возврат JSON, но у меня возникают проблемы, которые у меня есть ниже.

 [HttpGet]
    public JsonResult GetItemsEdit()
    {

        try
        {
           var data = _unitOfWork.Items.GetItems();

            return Json(new
            {
                data
               
            }, JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {

            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return Json(ex.Message);
        }

        
    }
  

и это мой код вызова ajax:

  // Gets Items on Dropdown

        $.ajax({
            type: "GET",
            url: "/Payments/GetItemsEdit",
            datatype: "application/json",
            
            success: function (data) {
                debugger
                alert("ok");
                $.each(data, function (index, value) {
                    $('#Item').append('<option value="'   value.Id   '">'   value.itemName   '</option>');
                });
            },
            error: function (err) {
                console.log("AJAX error in request: "   JSON.stringify(err, null, 2));
            }
        });
  

Я получаю HTTP 500 с исключением, как показано в названии этого вопроса.

Это ошибка или моя реализация?

Комментарии:

1. какую библиотеку json вы используете?

Ответ №1:

Нет, это не ошибка, и на самом деле проблема не в вашей реализации. Проблема заключается в структуре возвращаемой модели.

Вы можете либо преобразовать свою модель в другую модель без ссылок вручную, например.

 var data = _unitOfWork.Items.GetItems().Select(x => new { ... });
  

или, в зависимости от используемого вами сериализатора json, вы можете включить игнорирование циклических ссылок.

пример для Newtonsoft.json

 services
  .AddMvc()
  .AddJsonOptions(jsonOptions => { jsonOptions.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; } );
  

Еще немного информации о System.Text.Библиотека Json.

Комментарии:

1. как я могу игнорировать циклические ссылки по деталям, пожалуйста

2. где напишите эту строку в моем коде, пожалуйста services .AddMvc() .AddJsonOptions(jsonOptions => { jsonOptions.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; } );

3. в вашем Startup.cs. Я не уверен, какую версию .net / .net core вы используете (и какой сериализатор json).

4. я использую json версии 6 и .net mvc

5. извините, пропустил эту часть. Мой ответ был нацелен на .net core