Jquery &引用;序列化类型为';的对象时检测到循环引用;System.Reflection.RuntimeModule'&引用;

Jquery &引用;序列化类型为';的对象时检测到循环引用;System.Reflection.RuntimeModule'&引用;,jquery,json,asp.net-mvc,asp.net-mvc-4,asp.net-ajax,Jquery,Json,Asp.net Mvc,Asp.net Mvc 4,Asp.net Ajax,我试图使用jQuery返回JSON结果中MVC模型的对象。我收到的失败消息如下: 序列化“System.Reflection.RuntimeModule”类型的对象时检测到循环引用 这是我的控制器,我在这里返回Json结果 public ActionResult populateData(string application, string columns, string machine, string pages, string startDate, string endDate) {

我试图使用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);
    }

请帮助我们如何将模型类对象返回到Ajax post调用?

当对象的属性有自己的属性指向父对象时,会发生循环引用。它会导致无限循环。如果看不到类ErrorPage的组成细节,就很难告诉您是哪个属性导致了这种情况


但这类问题的典型解决方案是创建一个与类结构完全相同的ViewModel,但不包含循环引用,或者您可以使用它添加一些装饰属性,以便在序列化过程中忽略属性。

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


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

我们来寻求解决方案

我用下面的一组代码修改了我的代码,它对我起了作用

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()将再次对其进行序列化。
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);
    }