0

コントローラー内にこのコードがあります

[HttpPost]
public ActionResult Index([DataSourceRequest]DataSourceRequest request)
{
    var tickets = db.Tickets.Include(t => t.AreaOfBusiness).Include(t => t.Assignee).Include(t => t.Severity).Include(t => t.TicketStatu);
    return this.Json(tickets.ToDataSourceResult(request));
}

しかし、私は得る

タイプ 'System.Data.Entity.DynamicProxies.Ticket_2B104FE45830306408DA130C08090F61ADA6B8A0106592FECE85087B94B のオブジェクトをシリアル化中に循環参照が検出されました

KendoGridの起動時。

NewtonSoft Json.Net は循環参照を処理できると読みました。使い方が理解できません。

Json.Net を使用するためにコードを変更するのを手伝ってもらえますか?

事前にサンクス!

4

2 に答える 2

1

ToDataSourceResultオブジェクトを返しますDataSourceResult

剣道資料

タイプのオブジェクトをシリアライズ中に循環参照が検出されました

このエラーの原因は、Json メソッドで使用される JavaScriptSerializer クラスが、循環参照 (相互参照) を含むオブジェクト グラフをシリアライズできないためです。最善の解決策は、ビュー モデル オブジェクトを使用し、循環参照を作成するプロパティのシリアル化を避けることです。詳細については、「循環参照例外を回避する方法」 FAQ セクションを確認してください。

ドキュメントを見る

「循環参照例外を回避するにはどうすればよいですか?」:

シリアライズされたオブジェクトに循環参照が含まれている場合、JavaScriptSerializer クラスは例外をスローします。これを回避するには、View Model を使用し、循環参照を作成するプロパティを除外します。

例を見る

より多くのデータ

于 2013-01-03T00:11:11.170 に答える
1

または... json.net機能を有効にして、オブジェクトの循環参照の処理をシリアル化できます

あなたのglobal.asax.csで

System.Net.Http.Formatting.JsonMediaTypeFormatter jsonMediaTypeFormatter = GlobalConfiguration.Configuration.Formatters.OfType<System.Net.Http.Formatting.JsonMediaTypeFormatter>().FirstOrDefault();
jsonMediaTypeFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
jsonMediaTypeFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;

遅延読み込みを無効にすることを忘れないでください。そうしないと、データベース全体がダウンロードされます。必要な関係を維持し、今すぐ辞書のように動作する json を解析するには、dbsets で include を使用します。例: https://gist.github.com/keesey /7995398

于 2014-04-13T15:47:46.990 に答える