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

时间:2015-06-23 16:19:37

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

我试图使用jQuery在JSON结果中返回MVC Model的对象。我收到的失败信息是:

  

在序列化“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);
        }
    });

请帮助如何将Model类对象返回给Ajax post调用?

3 个答案:

答案 0 :(得分:7)

我们在这里寻找解决方案

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

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);
    }

我们需要对对象进行搜索,而不是发送Model的直接对象。

感谢。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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