Skip to main content
 首页 » 编程设计

c#之带有 Listdynamic> 数据源的 asp.net 网页/Razor WebGrid,排序问题

2024年08月06日37qq号

当 WebGrid 的数据源为 List<dynamic> 时,排序无法正常工作。 sortdir 不会在 ASC 和 DESC 之间切换。它总是升序。但是,如果我使用某个类的数据源,比如 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> 

请您参考如下方法:

这是 WebGrid 评估其数据源元素类型的方式(在本例中 List() 包含 dynamic 对象的实例。

基本上在内部,它将列表的元素类型评估为“对象”,而不是实现 IDynamicMetaObjectProvider 的动态类型,这是它用来读取数据源属性以找出列的内容用于排序的名称。为什么需要这样做对我来说就像是网格的错误,因为排序信息可能可以从 WebGridColumn 列表中读取。

要完成这项工作,您仍然需要 autoSortAndPage,但您还需要将列表元素更新为实现 IDynamicMetaObjectProvider 的动态对象。除了使用示例中的 dynamic 关键字,您还可以替换:

    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 赋值会动态添加它。

如果您对为什么像这样的框架组件无法按预期工作感到困惑,那么您可以选择调试框架代码,例如:

http://weblogs.asp.net/gunnarpeipman/stepping-into-asp-net-mvc-source-code-with-visual-studio-debugger

这就是向我强调的问题。