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; }
[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));