在开发ASP.NET MVC应用程序时,我发现一些地方的JsonResult操作会抛出异常“序列化对象时检测到循环引用”。
现在,我正在删除有问题的引用,但理想情况下,我希望简单地标记该属性,以便JSON序列化程序忽略它。
有没有人能建议我怎么做?
发布于 2009-08-12 22:46:15
我通常发现,对于复杂的对象,最好是通过创建一个临时的“中间”对象来进行序列化:
例如,对于推荐信,我做了以下操作。我实际上是在我的ASPX模型页面的代码后台中这样做的。
这将创建一个很好的JSON对象。你会注意到,我甚至可以重构我的模型,页面仍然可以工作。它只是数据模型和页面之间的另一个抽象层。我不认为我的控制器应该尽可能多地了解JSON,但ASPX的“代码背后”肯定可以。
/// <summary>
/// Get JSON for testimonials
/// </summary>
public string TestimonialsJSON
{
get
{
return Model.Testimonials.Select(
x => new
{
testimonial = x.TestimonialText,
name = x.name
}
).ToJSON();
}
}
在我的ASPX中,我只是在一个块中这样做:
var testimonials = <%= TestimonialsJSON %>;
// oh and ToJSON() is an extension method
public static class ObjectExtensions
{
public static string ToJSON(this Object obj)
{
return new JavaScriptSerializer().Serialize(obj);
}
}
我已经准备好面对这一建议的强烈反对。来吧..。
我不是在访问数据,只是为View重新格式化一个模型。这是“视图模型”逻辑,而不是“控制器模型”逻辑。
发布于 2009-08-12 23:00:05
我建议使用JSON.NET。它允许序列化循环引用,并提供更多的序列化选项。
发布于 2009-08-13 01:11:32
西蒙说的话。添加一个小的AutoMapper操作来控制代码重量。
https://stackoverflow.com/questions/1269106
复制相似问题