1

问题

由于循环引用,当返回 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 属于没有实现IEntityWithRelationships 的实体对象时,这种类型的对象不能被序列化。

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

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

4

2 回答 2

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; }
}
于 2017-04-25T15:50:13.057 回答
1

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

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

于 2012-06-06T13:30:05.690 回答