问题
由于循环引用,我在返回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);
}
似乎.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 ... )
会有效吗?
感谢任何帮助。谢谢!
答案 0 :(得分:3)
您还可以使用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; }
}
答案 1 :(得分:1)
除非你在控制器中重载了Json(..)方法,否则它们将使用.NET JavaScript序列化程序而不是JSON .NET。
其次,不要直接返回EF类实例,因为它们具有不同的依赖关系以及可能的延迟加载关联。毛的数据改为专门设计的view / json模型类。