似乎有很多與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中擰緊綁定列。必須有一種方法!
啊!我需要嵌套對象,但是你給了我一個關於下一個最好的東西的想法。我可以讓getter在嵌套對象上使用ScriptIgnore屬性展平MyObject。這是一個更多的工作,但它的工作原理! – Levitikon
很高興幫助你走了:-) –