我有一个像这样的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内部服务器错误
我的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<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中=&gt; XHR =&GT; 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
}
答案 0 :(得分:4)
当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; }
}
答案 1 :(得分:0)
如何在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));