Asp.net
序列化“System.Reflection”類型的對象時檢測到循環引用
我有一個這樣的 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 成功中解析集合。我將成功更改為關注,但它沒有在表中添加行。
您正在返回一個包含以下欄位的集合:
Id、DialPrefix、Rate,並且您沒有使用它們。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; } }