0

DataTable へのバインディングに関して多くの質問があるようですが、私の正確な状況に触れることはできませんでした。

私は現在、次のようなオブジェクトのリストで ajax バインディングを行っています。

public class MyObject
{
   public string Name { get; set; }
   public string Something1{ get; set; }
   public string Something2{ get; set; }
   public string Something3 { get; set; }
   public MyObjectMyObject2 { get; set; }
}

public class MyObject2
{
    public string Color { get; set; }
    public string Something4 { get; set; }
}

[GridAction]
public ActionResult GetData()
{
   var data = QueryDatabaseAndInstantiateAListOfMyObjects();

   return View(new GridModel(data));
}

そして、次のようなビューで:

<%= Html.Telerik().Grid<MyObject>()
        .DataBinding(dataBinding => dataBinding.Ajax().Select("GetData", new { action = "GetData" }))
        .Name("Grid1")
        .Columns(columns =>
        {
            columns.Bound(o => o.Name).Title("Name1");
            columns.Bound(o => o.MyObject2.Color).Title("Color");
            columns.Bound(o => o.Something1).Hidden(true);
            columns.Bound(o => o.Something2).Hidden(true);
            columns.Bound(o => o.Something3).Hidden(true);
            columns.Bound(o => o.MyObject.Something4).Hidden(true);
        })
%>

これは、並べ替え、グループ化、および上記のすべてを実行できるため、うまく機能します。

私の状況では、MyObject に多くのプロパティがあり、数メガバイトの応答データを生成するいくつかのエッジ ケースがポップアップしています。その理由は、ユーザーが右クリックして表示できる状況依存の非表示の列が多数あるためです。問題は、これらすべての余分な隠し列のデータが、使用されていない場合でも応答データに含まれていることです。グループ化、グループ化解除、列の表示、および非表示の操作はとにかくデータをフェッチするので、余分なデータがすべてそれに付随する必要があるのはなぜですか?

表示される列にデータを入力するために必要なデータのみを返すことができ、カスタム属性で何らかの方法でマークできることをいくつか言うことができれば、返されるデータのサイズを大幅に削減できます。

そこで、オブジェクトのリストを DataTable に変換して、条件付きで列とデータを追加し、それを GridModel にフィードできるようにしました。これは、o.MyObject2.Color などのネストされたオブジェクトにある列でグループ化しようとするまではうまくいきました。私はこの例外に遭遇します:

指定された名前のプロパティ: MyObject2.Color が型で見つかりません: System.Data.DataRowView

これは理にかなっていると思いますが、どうすればこれを克服できますか?Object Shredder を使うと、["Name"] を文字列、["MyObject2"] を MyObject2 として、MyObject の各プロパティをゆるく型付けして設定します。ただし、["MyObject2"] より後のすべては、強く型付けされています: (dataRow["MyObject2"] as MyObject2).Color. そして、これが私の頭を悩ませているところです。

使用されていない余分なデータが送信されるという最初の問題を克服する別の方法はありますか? または、DataTable ビットに関するアドバイスはありますか? また、DataTable を IEnumerable に変換しようとしましたが、そのような運はありませんでした。シリアル化された Json はかなり空です。また、datarow["MyObject2.Color"] を文字列として持つなど、ネストされたすべてのオブジェクトをフラット化しようとしましたが、これは JavaScript でこの列を参照するときに大混乱を招くため、アンダースコア区切り文字 ["MyObject2_Color"] を使用する必要がありましたが、これは本当にUI で列のバインドを台無しにします。方法がなければなりません!

4

2 に答える 2

0

これが本当の答えですが、私はアルファルファのアイデアに敬意を表します。

DataTable のアイデアを引き続き使用しますが、getter を使用してネストされた各オブジェクト プロパティを公開します。少し複雑で壊れやすいですが、機能します。

public class MyObject
{
   public string Name { get; set; }
   public string Something1{ get; set; }
   public string Something2{ get; set; }
   public string Something3 { get; set; }
   [ScriptIgnore()]
   public MyObjectMyObject2 { get; set; }

   public string Color { get { return this.MyObject2.Color; } }
   public string Something4 { get { return this.MyObject2.Something4; } }
}

public class MyObject2
{
    public string Color { get; set; }
    public string Something4 { get; set; }
}
于 2012-06-26T13:52:37.987 に答える
0

Colorとを表示するためだけに、完全なオブジェクトを戻す理由がわかりませんSomething4。平らにしてみてください。モデルのプロパティに値Colorとプロパティを割り当てるだけのこのようなもの。Something4

public class MyObject
{
   public string Name { get; set; }
   public string Something1{ get; set; }
   public string Something2{ get; set; }
   public string Something3 { get; set; }
   public string Something4 { get; set; }
   public string Color { get; set; }
}

[GridAction]
public ActionResult GetData()
{
   var data = QueryDatabaseAndInstantiateAListOfMyObjects();
   data.Something4 = MyObject2.Something4;
   data.Color = MyObject2.Color;
   return View(new GridModel(data));
}
于 2012-06-26T13:37:07.773 に答える