この状況の環境:
としてマークアップされたフィールドを含めると便利な状況に遭遇しました[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; }
}
ここでわかるように、 にFoo
は多くの が関連付けられていBars
ます。そして aBar
には が関連付けられていFoo
ます。
状況に戻ります。include ステートメントを使用して、この関連付けをコントローラーにロードしています。
.Include( foo => foo.Bars );
include は[ScriptIgnore]
注釈の影響を受けないため、スローされるエラーはありません。デバッグ時に検査すると、関連付けが適切に構築されます。のリストがありfoos
、それぞれfoo
に の関連リストがありBars
ます。
ここで、この構築されたリストをシリアル化したいと思います。データでいっぱいになるビューモデルがあります。次のようになります。
public class FooView
{
public List<Foo> Foos { get; set; }
public string AsJson()
{
var serializer = new JavaScriptSerializer();
return serializer.Serialize(this);
}
}
したがって、このビューモデルをビューに渡してシリアル化します。
@model FooView
<script type="text/javascript">
var fooViewModel = @( Html.Raw( Model.AsJson() ) );
</script>
例外はスローされませんが、シリアライゼーションは でBars
マークされたフィールド ( ) を適切にスキップし[ScriptIgnore]
ます。調べconsol.log(fooViewModel)
てみると、 の配列があることは明らかですが、 のいずれにもFoo
の関連する配列はありません。Bar
Foos
[ScriptIgnore]
このタグを一度だけスキップする方法はありますか? 毎回スキップした場合、シリアライザーは Foo をシリアル化し、Bar 型のコレクションを見て確認し、各 Bar をシリアル化し、Bar に関連付けられた Foo があることに気付き、Foo をシリアル化し、Foo に Bar 型のコレクションがあることに気付きます.. 。等。Bar
初めてのコレクションだけをつかみたい。これを達成する方法はありますか?Foo
Barからシリアル化しようとしますが、空になります。これはすべて熱心な読み込みで行われ、オブジェクト グラフ全体が既に構築されています。