【问题标题】:"A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'" [duplicate]“在序列化'System.Reflection.RuntimeModule'类型的对象时检测到循环引用” [重复]
【发布时间】:2015-09-09 13:45:25
【问题描述】:

我正在尝试使用 jQuery 在 JSON 结果中返回 MVC 模型的对象。我收到一条失败消息:

在序列化“System.Reflection.RuntimeModule”类型的对象时检测到循环引用

这是我要返回 Json 结果的控制器

public ActionResult populateData(string application, string columns, string machine, string pages, string startDate, string endDate)
    {

        ErrorPage _objError = new ErrorPage();
        _objError.ErrorData = dbl.GetDataTable(DbConnectionString, Table, whereCondition, columns);


        //Column description: Name and Type    
        var columnlist = new Dictionary<string, System.Type>();
        foreach (System.Data.DataColumn column in _objError.ErrorData.Columns)
        {       
            var t = System.Type.GetType( column.DataType.FullName );
            columnlist.Add(column.ColumnName, t);  
        }

        _objError.ErrorColumns = columnlist;


        //DataSourceRequest result = _objError.ToDataSourceResult(request);

        if (_objError.ErrorData.Rows.Count > 0)
            Message = "Showing Error log for " + AppName + " . To Change the application or filtering options please select the appropriate application from Application Dropdown";
        else
            Message = "No errors found for " + AppName + " in last 24 hours.";


        return Json(_objError);
    }

在这里,我正在对 Controller 方法进行 Ajax 调用:

$.ajax({
        type: "POST",
        url: '@Url.Content("~/Common/PopulateData")',
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        data: JSON.stringify({ application: app, columns: columns, machine: machine, pages: pages, startDate: startDate, endDate: endDate }),
        success: function (data) {
            alert("Success");
        },
        error: function (error) {
            alert('error; ' + eval(error));
            alert('error; ' + error.responseText);
        }
    });

请帮助如何将模型类对象返回给 Ajax 调用后?

【问题讨论】:

    标签: jquery json asp.net-mvc asp.net-mvc-4 asp.net-ajax


    【解决方案1】:

    我们在这里寻找解决方案

    我用下面的代码修改了我的代码,它对我有用

    public JsonResult populateData(string application, string columns, string machine, string pages, string startDate, string endDate)
        {
            ErrorPage _objError = new ErrorPage();
            var ErrorResult = _objError.GetErrorData(application, columns, machine, pages, startDate, endDate);
    
    
            var result = JsonConvert.SerializeObject(ErrorResult.ErrorData, Formatting.Indented,
                           new JsonSerializerSettings
                           {
                               ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                           });
    
            return Json(result, JsonRequestBehavior.AllowGet);
        }
    

    我们需要对对象进行序列化,而不是直接发送模型对象。

    谢谢。

    【讨论】:

    • 这里不是序列化两次数据吗? result 在传递给 Json() 时已经序列化,Json() 会再次对其进行序列化。
    【解决方案2】:

    当对象的属性具有自己的属性并指向父对象时,就会发生循环引用。它会导致无限循环。如果没有看到构成类 ErrorPage 的详细信息,就很难告诉您哪个属性对此负责。

    但是这种事情的典型解决方案是创建一个与您的类结构相同但减去循环引用的 ViewModel,或者您可以使用 https://json.codeplex.com/ 它有一些装饰属性,您可以添加一些装饰属性以在期间忽略一个属性序列化。

    【讨论】:

      【解决方案3】:

      错误消息非常明确:您要序列化的对象 (_objError) 具有循环引用。这意味着它的一个属性直接或间接地指向它自己的实例。前任。实例 A 有一个指向实例 B 的属性,该属性指向实例 A(类似于父属性)。

      这会导致序列化失败,因为它会创建一个无限循环(A.child = B / B.parent = A / A.child = B / ...)。为了解决这个问题,您必须通过忽略导致循环引用的属性或创建不具有此类属性的其他对象来破坏循环引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        相关资源
        最近更新 更多