似乎有很多与绑定 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 时,它会将 MyObject 的每个属性设置为松散类型,例如将 ["Name"] 设置为字符串,将 ["MyObject2"] 设置为 MyObject2。但是 ["MyObject2"] 之后的所有内容都是强类型的:(dataRow["MyObject2"] as MyObject2).Color。这就是我无法理解的地方。
有没有另一种方法来克服我最初发送的所有未使用的额外数据的问题?或者,对 DataTable 位有什么建议吗?我也尝试过将 DataTable 转换为 IEnumerable ,但没有这样的运气。序列化的 Json 是相当空的。我也尝试过展平所有嵌套对象,例如将 datarow["MyObject2.Color"] 作为字符串,但是在 JavaScript 中引用此列时会造成严重破坏,因此我不得不使用下划线分隔符 ["MyObject2_Color"] 但这确实搞砸了 UI 中的绑定列。一定有办法!