首页 > 解决方案 > 序列化“System.Data.Entity.DynamicProxies.Item”类型的对象时检测到循环引用

问题描述

我正在尝试做一个简单的 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 异常,如本问题的标题所示。

这是一个错误还是我的实现?

标签: c#ajaxasp.net-mvc

解决方案


不,这不是错误,实际上问题不在于您的实现。问题是返回模型的结构。

您可以将您的模型转换为不同的模型而无需手动参考,例如。

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库的更多见解


推荐阅读