当WebGrid的数据源为List<dynamic>
时,排序无法正常工作。 sortdir不在ASC和DESC之间切换。它始终是ASC。但是,如果我使用某个类的数据源,例如List<SomeClass>
,那么它可以正常工作。
我想使用List<dynamic>
,因为我要合并来自不同表格的字段,并且我希望避免创建其他类并将List<dynamic>
结果循环到该附加类或把它投到那个班级。
以下示例代码重新创建问题。
C#:
List<dynamic> dynList = new List<dynamic>();
for(int i=1; i < 11; i++)
{
dynamic newObj = new
{
Id = i
};
dynList.Add(newObj);
}
WebGrid grid = new WebGrid(rowsPerPage: rowCountPerPage);
grid.Bind(source: dynList, rowCount: totalRowCount, autoSortAndPage: false);
标记:
<div>
List<WebGridColumn> gridColumns = new List<WebGridColumn>();
gridColumns.Add(new WebGridColumn() { ColumnName = "Id", Header = "Id", CanSort = true });
@grid.GetHtml(htmlAttributes: new { id = "tblResult" }
, mode: WebGridPagerModes.All
, numericLinksCount: 10
, columns: grid.Columns(gridColumns.ToArray()))
</div>
答案 0 :(得分:2)
这是WebGrid评估其数据源元素类型的方式(在本例中为 List(),包含动态对象的实例。
基本上在内部,它将列表的元素类型评估为“对象”,而不是实现 IDynamicMetaObjectProvider 的动态类型,这是它用于读取数据源属性以确定列的内容用于排序的名称。为什么它需要以这种方式进行操作感觉就像网格中的错误,因为可以从 WebGridColumn 列表中读取排序信息。
要完成这项工作,您仍然需要 autoSortAndPage ,但您还需要将列表元素新增为实现 IDynamicMetaObjectProvider 的动态对象。您可以替换:
,而不是仅使用示例中的动态关键字 dynamic newObj = new
{
Id = i
};
dynList.Add(newObj);
而是创建 System.Dynamic.ExpandoObject 的实例,以添加到网格的数据源中:
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Id = i;
dynList.Add(obj);
您可以将 ExpandoObject 的属性分配为动态对象。例如, ExpandObject 不包含 Id 属性,但是 obj.Id = i assignment 会动态添加它。< / p>
如果您遇到这样的框架组件无法正常工作的原因,那么您可以选择调试框架代码,例如:
这就是我强调的问题。
答案 1 :(得分:1)
James正确地评论说您需要使用使用IDynamicMetaObjectProvider的动态类型。我创建了一个示例,能够复制您的问题,下面是使用System.Dynamic.Expando类型的修复。
控制器:
var inventoryList = new List<dynamic>();
for (int i = 0; i < 5; i++)
{
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Id = string.Format("P10{0}", i);
obj.Name = string.Format("{0} Testing", i);
inventoryList.Add(obj);
}
return View(inventoryList);
Mark Up:
@{
var grid = new WebGrid(Model, canSort: true);
grid.Pager(WebGridPagerModes.NextPrevious);
var gridColumns = new List<WebGridColumn>
{
new WebGridColumn()
{
ColumnName = "Id", Header = "Id", CanSort = true
},
new WebGridColumn()
{
ColumnName = "Name", Header = "Name", CanSort = true
}
};
}
<div>
@grid.GetHtml(tableStyle: "webGrid",
headerStyle: "header",
alternatingRowStyle: "alt",
selectedRowStyle: "select",
columns: grid.Columns(
gridColumns.ToArray()
))
答案 2 :(得分:0)
您被指定为 autoSortAndPage 属性为false。将此属性更改为true