2017-03-03 12 views
0

サーバ側処理用データテーブル の2次元JSONオブジェクトが必要ですが、このエラーがシリアル化されています。ヘルプありがとうございました.net MVC/datatables.net ServerSide処理 - 循環参照エラー

エラー 'System.Reflection.RuntimeModule'タイプのオブジェクトをシリアル化している間に循環参照が検出されました。これで

DataTable data = AlleArtikelWork.GetAllArtikel(myLimit); 
var myjson = Json(data); 
myjson.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
JsonResult rtnjson = Json(new { draw = draw, recordsFiltered = totalRecords, recordsTotal = totalRecords, data= myjson }, JsonRequestBehavior.AllowGet); 
return rtnjson; 

同じエラー:このコードで

DataTable data = AlleArtikelWork.GetAllArtikel(myLimit); 
JsonResult rtnjson = Json(new { draw = draw, recordsFiltered = totalRecords, recordsTotal = totalRecords, data= data }, JsonRequestBehavior.AllowGet); 
return rtnjson; 

はスティーブンがコメントで言ったように、それは試してみて、シリアル化するためにおそらく悪い考えですあなた

+0

「DataTable」は使用しないでください。必要なプロパティのみを含むモデルを作成し、それを渡します。 –

+0

これは役に立ちます:https://www.codeproject.com/Articles/1118363/GridView-with-Server-Side-Filtering-Sorting-and-Pa –

答えて

1

に感謝しますDataTableを直接。そのエラーをスローしなかったとしても、最終的なJSON文字列にはDataTableクラスとDataRowクラスのすべてのpublicプロパティ(data.CaseSensitive、data.IsInitialized、data.DesignModeなどなど)が含まれるため、あなたのシリアライズされたオブジェクトを受け取っている誰にとっても無駄な迷惑データになります。

練習はあなたが実際にシリアライズするを必要とし、あなたのGetAllArtikel()メソッドからのデータを使用することにより、これらのオブジェクトの配列を構築するために少し退屈なコードを書くだけデータが含まれている独自のクラスを作成することですベター。

ここでは、実際にこのようなことが起こっている理由は何もありません。エラー。だから、

public class ClassA 
{ 
    public ClassB ObjectB; 
} 

public class ClassB 
{ 
    public ClassA ObjectA; 
} 

public JsonResult SomeMethod() 
{ 
    var objA = new ClassA(); 
    var objB = new ClassB(); 

    objA.ObjectB = objB; 
    objB.ObjectA = objA; 

    return Json(objA); 
} 

今、我々は」、:あなたは、エラーが発生した理由を理解したい場合はどこかにシリアライズしようとしているのDataTableクラスのすべてのそれらのパブリックプロパティで、あなたはこのような状況を持っている、ので、それはです両方のオブジェクトがあるは、公共のプロパティを指している、これはあなたのエラーの根本的な原因です。通常、この状況は完璧ですが、シリアル化すると問題になる可能性があります。シリアライザは、このようなJSON文字列を構築しようとしている状況で終わる、再帰的にOBJAのすべてのパブリックプロパティをナビゲートするために起こっている:

{ 
    "ObjectB" : { 
    "ObjectA": { 
     "ObjectB": { 
     "ObjectA": { 
      "ObjectB": { 
      .. and so on, infinitely! 

結局、シリアライザは、それがで起こっていることを実現するのに十分なスマートですあなたが見た "循環参照が検出されました"例外をスローします。

.net JSONシリアライザをカスタマイズして(エラーをスローする代わりに)この状況を別々に処理する方法がありますが、状況によってはスティーブンスのアドバイスを受け取り、DataTableを直接シリアル化しないことさえあります。 がDictonaryへのDataTableを変換し、

public List<Dictionary<string, object>> TableToDict(DataTable table) 
    { 
     List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
     Dictionary<string, object> row; 
     foreach (DataRow dr in table.Rows) 
     { 
      row = new Dictionary<string, object>(); 
      foreach (DataColumn col in table.Columns) 
      { 
       row.Add(col.ColumnName, dr[col]); 
      } 
      rows.Add(row); 
     } 
     return rows; 
    } 

同じJSON関数を呼び出すとするJsonResultを返す:

JsonResult rtnjson = Json(new { draw = draw, recordsFiltered = totalRecords, recordsTotal = totalRecords, data = TableToDict(data)}, JsonRequestBehavior.AllowGet); 
GOOTを作品

0

は問題自体

ソリューションを説明いただきありがとうございますthx

関連する問題