23

この質問は、私の元の投稿の一部です。GetData Into Extjs GridPanel

以下は、SQLデータベースからデータを読み取るコントローラーです。結果をJSONとしてエンコードし、データをgridview.jsに返送しようとしています。

public JsonResult writeRecord()
//public string writeRecord()
    {

        Response.Write("Survey Completed!");
        SqlConnection conn = DBTools.GetDBConnection("ApplicationServices2");


        string sqlquery = "SELECT Q1, Q2, Q3, Q4, Improvements, Comments FROM myTable";
        SqlDataAdapter cmd = new SqlDataAdapter(sqlquery, conn);


        DataSet myData = new DataSet();
        cmd.Fill(myData, "myTable");

        conn.Open();
        conn.Close();

        return Json(myData, JsonRequestBehavior.AllowGet);
        //return myData.GetXml();

    } 

ここに問題があります。上記のコードでは、gridview.jsを実行すると、データのないgridviewテーブルが取得されますが、このようにコントローラーのメソッドに直接アクセスすると、

http://localhost:55099/GridView/writeRecord

このエラーが発生します、

タイプ'System.Globalization.CultureInfo'のオブジェクトをシリアル化しているときに、循環参照が検出されました。 説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとエラーがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。 例外の詳細: System.InvalidOperationException:タイプ'System.Globalization.CultureInfo'のオブジェクトのシリアル化中に循環参照が検出されました。

誰か助けてもらえますか。

4

2 に答える 2

41

JSONのシリアル化と逆シリアル化には次のツールを使用します。

http://james.newtonking.com/pages/json-net.aspx

非常に使いやすく、非常に軽量です。

シリアル化するときは、次のオプションを使用します。

JsonConvert.SerializeObject(myObject, Formatting.Indented, 
                            new JsonSerializerSettings { 
                                   ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
                            })

循環参照は無視されます。

また、newtonkingのjson.netは非常に高速です。

他のオプションは、DTOを使用し、Diverが述べたようにAutomapperを介してそれらをマップすることです。

編集:あなたの店が間違っていると思います:

var store = Ext.create('Ext.data.JsonStore', {      
        storeId: 'myData',
        reader: new Ext.data.JsonReader({
            root: 'myTable',
            fields: [{ name: 'Q1', type: 'int' },
                     { name: 'Q2', type: 'int' },
                     { name: 'Q3', type: 'int' },
                     { name: 'Q4', type: 'int' },
                     { name: 'Q5', type: 'int' },
                     { name: 'Improvements', type: 'string' },
                     { name: 'Comments', type: 'string'}]
        }),

        proxy: {
             type: 'json',
            url: 'GridView/writeRecord'
        }    
});  
于 2012-09-25T14:37:37.610 に答える
5

これは、CultureInfo内の何かがそれ自体(このタイプ)への参照を持っており、JSONへの変換中に失敗するためです。この状況を回避するには、ViewModelsを使用する必要があります(必要な情報のみをクライアントに返します)。詳細については、 http://blogs.msdn.com/b/dphill/archive/2009/01/31/the-viewmodel-pattern.aspxを参照してください。

あなたの状況では、データのViewModelを作成し、データをこれらのデータ型に変換して、JSONに変換して返す必要があります。ModelからViewModelに変換する目的で、AutoMapperhttp://automapper.codeplex.com/または同様のツールの使用を検討してください

于 2012-09-25T14:28:25.157 に答える