C# 跳过[脚本忽略]一次

C# 跳过[脚本忽略]一次,c#,asp.net-mvc-3,entity-framework-4,javascriptserializer,scriptignore,C#,Asp.net Mvc 3,Entity Framework 4,Javascriptserializer,Scriptignore,这种情况的环境: asp.NETMVC3 c# 实体框架4.3.1 JavaScriptSerializer 我遇到了这样一种情况:最好包含一个标记为[ScriptIgnore]的字段。如果没有该属性,则该字段将构成循环引用并引发异常。原因与此类似: public class Foo { public int FooId { get; set; } [ScriptIgnore] public virtual Collection<Bar> Bars { get; set; }

这种情况的环境:
  • asp.NETMVC3
  • c#
  • 实体框架4.3.1
  • JavaScriptSerializer

    我遇到了这样一种情况:最好包含一个标记为
    [ScriptIgnore]
    的字段。如果没有该属性,则该字段将构成循环引用并引发异常。原因与此类似:

    public class Foo
    {
     public int FooId { get; set; }
    
     [ScriptIgnore]
     public virtual Collection<Bar> Bars { get; set; }
    }
    
    public class Bar
    {
     public int BarId { get; set; }
     public int FooId { get; set; }
     public virtual Foo Foo { get; set; }
    }
    
    没有引发错误,因为include不受
    [ScriptIgnore]
    注释的影响。调试后,在检查时正确构造关联。有一个
    foo
    列表,每个
    foo
    都有一个相关的
    条列表

    现在我想序列化这个构造的列表。我有一个充满数据的视图模型,它看起来像这样:

    public class FooView
    {
     public List<Foo> Foos { get; set; }
    
     public string AsJson()
     {
      var serializer = new JavaScriptSerializer();
      return serializer.Serialize(this);
     }
    }
    
    公共类视图
    {
    公共列表Foos{get;set;}
    公共字符串AsJson()
    {
    var serializer=新的JavaScriptSerializer();
    返回序列化程序。序列化(此);
    }
    }
    
    因此,我将此viewmodel传递到视图中并序列化它:

    @model FooView
    <script type="text/javascript">
     var fooViewModel = @( Html.Raw( Model.AsJson() ) );
    </script>
    
    @model-FooView
    var fooViewModel=@(Html.Raw(Model.AsJson());
    
    但是,不会引发异常,序列化会正确跳过标记为
    [ScriptIgnore]
    的字段(
    )。通过
    consol.log(fooViewModel)
    检查,很明显存在
    Foo
    数组,但是在任何
    Foo
    中都没有相关的
    Bar
    数组


    有没有办法跳过这个
    [ScriptIgnore]
    标记一次?我意识到如果每次都跳过它,那么序列化程序就会序列化Foo,查看类型Bar的集合,序列化每个Bar,注意Bar有一个关联的Foo,序列化Foo,注意Foo有一个类型Bar的集合……等等。我只想第一次抓取
    Bar
    的集合。有没有办法做到这一点?我意识到它将尝试从Bar序列化
    Foo
    ,但它将是空的。这一切都是通过即时加载完成的,并且整个对象图已经构建好了。

    当我遇到这个问题时,我最终做的是用Json.NET序列化程序替换序列化程序,它具有设置,特别是

    _jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    
    Json.NET将忽略引用循环中的对象,而不会序列化它们。第一次遇到对象时,将像往常一样对其进行序列化,但如果该对象是作为其自身的子对象遇到的,则序列化程序将跳过对其进行序列化

    设置的信息是 我曾经 替换序列化程序,然后将其作为默认值添加到global.asax.cs

    configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings));
    

    我意识到这是一个解决方案(实际上不是处理scriptignore),但是,我从提供的数据库中获得了太多循环引用,因此它似乎是当时最好的解决方案。

    不确定我是否会走这条路,但感谢您提供了一个解决方案。
    configuration.Formatters.Insert(0, new JsonNetFormatter(serializerSettings));