ASP.NET MVC 5 在序列化“Data.Item”类型的对象时检测到循环引用

Posted

技术标签:

【中文标题】ASP.NET MVC 5 在序列化“Data.Item”类型的对象时检测到循环引用【英文标题】:ASP.NET MVC 5 A circular reference was detected while serializing an object of type 'Data.Item' 【发布时间】:2020-04-27 14:20:54 【问题描述】:

我的 ASP.NET MVC 项目中出现循环引用错误

这是模型

public partial class Item


    public Item()
    
        this.Inventories = new HashSet<Inventory>();
        this.PurchasesDetails = new HashSet<PurchasesDetail>();
        this.SalesDetails = new HashSet<SalesDetail>();
    

    public int Id  get; set; 
    public string Code  get; set; 
    public int CategoryID  get; set; 
    public string Name  get; set; 
    public int MeasurementID  get; set; 
    public int Quantity  get; set; 
    public decimal BuyPrice  get; set; 
    public decimal SalePrice  get; set; 
    public decimal CommisionRate  get; set; 
    public Nullable<System.DateTime> MftDate  get; set; 
    public Nullable<System.DateTime> ExpDate  get; set; 
    public Nullable<int> StockLimit  get; set; 
    public string Description  get; set; 
    public string UserID  get; set; 
    public virtual AspNetUser AspNetUser  get; set; 
    public virtual Category Category  get; set; 
    public virtual ICollection<Inventory> Inventories  get; set; 
    public virtual Measurement Measurement  get; set; 
    public virtual ICollection<PurchasesDetail> PurchasesDetails  get; set; 
    public virtual ICollection<SalesDetail> SalesDetails  get; set; 

这是获取 JSON 的代码

 db.Configuration.ProxyCreationEnabled = false;
        var items = db.Items.Include(i => i.AspNetUser).Include(i => i.Category).Include(i => i.Measurement).ToList();
        return Json(new  data = items , JsonRequestBehavior.AllowGet);

我尝试使用db.Configuration.ProxyCreationEnabled = false;,但它不起作用。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我试过了

var plan_master = from s in db.Plan_Master select s;

        var plans = plan_master.Select(S => new
        
            S.Plan_ID,
            S.Plan
        );

        return Json(new  data = plans , JsonRequestBehavior.AllowGet);

【讨论】:

【参考方案2】:

在 global.asax 中将这段代码用于全局 Json 序列化设置:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

尝试使用以下代码更改以下部分:

string json = JsonConvert.SerializeObject(items, Formatting.None);
    return Json(new  data = json , JsonRequestBehavior.AllowGet);

【讨论】:

我收到此错误 '''Newtonsoft.Json.JsonSerializationException: '自引用循环检测到类型为 'Data.Item'。路径“[0].AspNetUser.Items”。 ''' imgur.com/c9nWVq4

以上是关于ASP.NET MVC 5 在序列化“Data.Item”类型的对象时检测到循环引用的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc中的Json序列化错误

ASP.NET MVC 下自定义 JsonResult,使用 Json.NET 序列化 JSON

ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)

对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败

在 ASP.NET MVC 中,在控制器的操作方法之前或之中反序列化 JSON

ASP.NET MVC Core API 将枚举序列化为字符串