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

我有一个像这样的asp.net MVC 3控制器动作方法:

public JsonResult GetRecordingRates(int Id) { List defaultRateCharts = new List(); 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内部服务器错误

我的ajax调用是这样的:

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

在响应标签下的firebug XHR中,它说:

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

[编辑]

我将动作方法更改为:

 public JsonResult GetRecordingRates(int Id) { List defaultRateCharts = new List(); 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 = $(''); for(var i = 0; i < data.length; i++) { row.append($('').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 = $(''); for(var i = 0; i < data.length; i++) { row.append($('').html(data[i])); } $('#results').append(row); 

您需要将它们添加到循环中:

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

当JSON中的两个或多个对象相互指向时,会发生这种情况,序列化程序无法将这些对象反映为JSON。 您应该使用Newtonsoft序列化程序(这里解释如何执行此操作: 使用JSON.NET作为ASP.NET MVC 3中的默认JSON序列化程序 – 是否可能? )

你可以做几件事。 第一个是让配置管理器知道忽略或保留这些引用,如下所示:

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

要么

您可以注释您不希望在对象中序列化的属性(因此不存在循环引用)。 使用这样的注释[JsonIgnore]:

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