似乎有很多与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));
}
而且具有像这样一个观点:
()
.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中拧紧绑定列。必须有一种方法!