2012-06-26 46 views
0

似乎有很多與DataTable綁定有關的問題,但沒有一個可以找到我的確切情況。通過綁定帶有嵌套對象的DataTable來減少Ajax數據足跡?

我目前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時,它將MyObject的每個屬性鬆散地鍵入,如[「Name」]作爲字符串,[MyObject2]作爲MyObject2。但過去[「MyObject2」]的所有內容都是強類型的:(dataRow [「MyObject2」] as MyObject2).Color。這就是我的頭腦。

是否有另一種方法來克服我最初發送的所有未發送的額外數據?或者,有沒有DataTable位的建議?我也試着將DataTable轉換爲IEnumerable,沒有這樣的運氣。序列化的Json非常空。我也嘗試了將所有嵌套對象展平,比如將datarow [「MyObject2.Color」]作爲字符串,但是當在JavaScript中引用這個列時,這會引發havok,所以我不得不使用下劃線分隔符[「MyObject2_Color」],但這真的在UI中擰緊綁定列。必須有一種方法!

回答

0

我沒有看到任何理由讓您的完整對象僅顯示ColorSomething4。嘗試弄平它。像這樣的東西,您只需將ColorSomething4的值分配給模型的屬性即可。

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)); 
} 
+0

啊!我需要嵌套對象,但是你給了我一個關於下一個最好的東西的想法。我可以讓getter在嵌套對象上使用ScriptIgnore屬性展平MyObject。這是一個更多的工作,但它的工作原理! – Levitikon

+0

很高興幫助你走了:-) –

0

這是真正的答案,但我在這個想法上給了苜蓿法。

我繼續DataTable的想法,但使用getters來公開每個嵌套的對象屬性。這有點讓人流連忘返,但它起作用!

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; } 
}