Asp.net

序列化“System.Reflection”類型的對象時檢測到循環引用

  • April 9, 2015

我有一個這樣的 asp.net MVC 3 控制器操作方法:

public JsonResult GetRecordingRates(int Id)
{            
   List<DefaultRateChart> defaultRateCharts = new List<DefaultRateChart>();
   using (IDefaultRateChartManager defaultRateChartManager = new ManagerFactory().GetDefaultRateChartManager()) {
      defaultRateCharts = defaultRateChartManager.GetAll().Where(rc => rc.Currency.Id == Id && (!rc.NumberPrefix.StartsWith("#") || rc.NumberPrefix.StartsWith("Default")) && rc.AccountCredit == "Credit").ToList();
   }
   return Json(defaultRateCharts);
}

我想將此列表發送到 jquery ajax 成功方法,但我收到 500 Internal Server Error

我的ajax呼叫是這樣的:

$.ajax({
type: "POST",
dataType: "json",
url: "/Home/GetRecordingRates",
data: {
   Id: $("#hdCurrencyId").val()                 
},
success: function (data) {
       alert(data);
  }
}); 

在響應選項卡下的 firebug XHR 中,它說:

序列化“System.Reflection.RuntimeModule”類型的對象時檢測到循環引用。

$$ EDIT $$ 我將操作方法更改為:

public JsonResult GetRecordingRates(int Id)
{
   List<DefaultRateChart> defaultRateCharts = new List<DefaultRateChart>();
   using (IDefaultRateChartManager defaultRateChartManager = new ManagerFactory().GetDefaultRateChartManager())
   {
       defaultRateCharts = defaultRateChartManager.GetAll().Where(rc => rc.Currency.Id == Id && (!rc.NumberPrefix.StartsWith("#") || rc.NumberPrefix.StartsWith("Default")) && rc.AccountCredit == "Credit").ToList();
   }

   return this.Json(
       new
       {
           Result = (from obj in defaultRateCharts select new { Id = obj.Id, DialPrefix = obj.NumberPrefix, Rate = obj.PurchaseRates })
       }
       , JsonRequestBehavior.AllowGet
    );
}

而且我現在沒有收到該錯誤,但是如何在 ajax 成功中解析集合。我將成功更改為關注,但它沒有在表中添加行。

success: function (data) {
           var row = $('<tr>');
           for(var i = 0; i < data.length; i++) {
               row.append($('<td>').html(data[i]));
           }   

           $('#results').append(row);                                      
           jQuery('#RecordingRates').dialog({ closeOnEscape: false });
           $(".ui-dialog-titlebar").hide();
           $("#RecordingRates").dialog({ dialogClass: 'transparent' });
           $('#RecordingRates').dialog('open');
          }
   }); 

在 Firebug Net => XHR=> Json 中,它顯示以下 JSON:

[Object { Id=

1

,  DialPrefix=

"1"

,  Rate=

2.6

}, Object { Id=

3

,  DialPrefix=

"2"

,  Rate=

2.6

}, Object { Id=

5

,  DialPrefix=

"7"

,  Rate=

3.5

}, 3 more...]


0
   Object { Id=

1

, DialPrefix=

"1"

, Rate=

2.6

}

1
   Object { Id=

3

, DialPrefix=

"2"

, Rate=

2.6

}

2
   Object { Id=

5

, DialPrefix=

"7"

, Rate=

3.5

}

3
   Object { Id=

7

, DialPrefix=

"8"

, Rate=

6

}

4
   Object { Id=

9

, DialPrefix=

"Default"

, Rate=

5

}

5
   Object { Id=

15

, DialPrefix=

"Subscription"

, Rate=

15

}

如何在 ajax 成功中解析集合。我將成功更改為關注,但它沒有在表中添加行。

您正在返回一個包含以下欄位的集合:IdDialPrefixRate,並且您沒有使用它們。

var row = $('<tr>');
for(var i = 0; i < data.length; i++) {
   row.append($('<td>').html(data[i]));
}   

$('#results').append(row);  

您需要將它們添加到循環中:

row.append($('<td>').html(data[i].DialPrefix));
row.append($('<td>').html(data[i].Rate));

當 JSON 中的兩個或多個對象相互指向時,就會發生這種情況,序列化程序無法將它們反映到 JSON 中。您應該使用 Newtonsoft 序列化程序(這裡解釋瞭如何做到這一點:Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 - is it possible?

您可以做幾件事。第一個是讓配置管理器知道忽略或保留這些引用,如下所示:

       config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
       config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;

或者

您可以在對像中註釋您不想序列化的屬性(因此不存在循環引用)。帶註釋

$$ JsonIgnore $$像這樣:

public class Order
{
   [JsonIgnore]
   public virtual ICollection<OrderLines> OrderLines{ get; set; } 
}

引用自:https://stackoverflow.com/questions/16279442