これが以前に尋ねられたことがあれば、私を許してください。数回検索した後、近いものは見つかりませんでした:
IQueryable を「インターセプト」し、実行時にすべての親子関係を無効にする ActionFilter を MVC に記述しようとしています。私がこれを行っているのは、親子関係がある場合、Linq がオブジェクトを適切にシリアル化しないためです (親が子を参照し、子が親を参照するため、循環参照エラーがスローされます)。オブジェクトが必要です。 Ajax 呼び出しのために Json にシリアライズされます。内部のプライバシー ステータスで DBML ファイルの子関係をマークしようとしました。これによりシリアル化の問題が修正されますが、ページのレンダリング時にビュー エンジンから子メンバーが非表示になり、別のエラーがスローされます。したがって、1 つの問題を修正することで、別の問題を引き起こします。
両方の問題を解決する唯一の方法は、シリアル化を返す直前に子メンバーを手動で null に設定することですが、面倒で再利用できないなどの理由で、それを避けようとしています。シリアル化されている IQueryable を使用し、EntitySet のタイプを持つメンバーを無効にします (外部キー/関連付けの表現方法)。ただし、私はリフレクションの経験があまりなく、このようなことを行う方法を示す例を見つけることができません。それで...これはリフレクションで可能ですか?同じことを達成するためのより良い方法はありますか? 明日、仕事用のコンピューターに戻ったら、関連するコードを投稿します。
ありがとう、
ダニエル
約束通り、コード:
[GridAction]
public ActionResult _GetGrid()
{
IQueryable<Form> result = formRepository.GetAll();
foreach (Form f in result)
{
f.LineItems = null;
f.Notes = null;
}
return View(new GridModel<Form> { Data = result });
}
追加のしわは、私が新しい Telerik MVC 拡張機能を使用していることです。そのため、実際には Json を自分でシリアル化していません。IGridModel で IQueryable を返すだけで、アクション フィルター [GridAction] が残りの処理を行います。