2012-06-06 136 views
1

问题ASP .NET - JsonIgnore似乎并没有工作

返回,因为循环引用的JSON结果时,我不能在MVC的.Net序列化一个对象。类型检测

自参照环......

我的实体类:

public class Subscriber 
{ 
    [JsonIgnore] 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

在控制器:

public JsonResult GetSubscribers(GridRequestModel model) 
{ 
    data = ... get data .. 
    JSON(data, JsonRequestBehavior.AllowGet); 
} 

看来THA t的.NET序列化程序似乎没有考虑到JsonIgnore,因为我仍然得到错误。


尝试性解决方案

我改变了我的控制器到以下几点:

public JsonResult GetSubscribers(GridRequestModel model) 
{ 
    data = ... get data .. 
    JsonSerializerSettings jsSettings = new JsonSerializerSettings(); 
    jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

    string json = JsonConvert.SerializeObject(data, Formatting.None, jsSettings); 

    JSON(json, JsonRequestBehavior.AllowGet); 
} 

这一次我得到:

的RelationshipManager对象无法序列化。当RelationshipManager属于未实现IEntityWithRelationships的 实体对象时,无法序列化此类型的 对象。

此外,不确定是否可以直接返回字符串,因为我有返回类型的JsonResult。 Json(json ...)工作吗?

任何帮助表示赞赏。谢谢!

回答

1

除非您在控制器中重载了Json(..)方法,否则它们将使用.NET JavaScript序列化程序而不是JSON .NET。

其次,不要直接返回EF类实例,因为它们具有不同的依赖性以及可能的延迟加载关联。将数据转换为专门设计的view/json模型类。

2

您还可以使用在System.Web.Extensions程序中发现的[ScriptIgnore]属性

public class SomeClass:Entity 
{ 
    public SomeClass() { } 
    public virtual int TestQuestionTypeValueId { get { return this.Id; } } 
    [ScriptIgnore] 
    public virtual TestQuestionTypes TestQuestionTypes { get; set; } 
    public virtual string QuestionTypeValueText { get; set; } 
    public virtual decimal QuestionTypeValue { get; set; } 
}