Круговая ссылка была обнаружена при сериализации объекта типа "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 success, но я получаю Внутренняя ошибка сервера
Мой вызов 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
}
Ответы
Ответ 1
как я могу проанализировать коллекцию в 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));
Ответ 2
Это происходит, когда два или более объекта в вашем JSON указывают друг на друга, сериализатор не может отражать их в JSON. Вы должны использовать сериализатор Newtonsoft (здесь объясняется, как это сделать: Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 - возможно ли это?)
Есть несколько вещей, которые вы можете сделать. Первым из них является то, что диспетчер конфигурации знает, чтобы игнорировать или сохранить эти ссылки следующим образом:
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; }
}