1

我需要显示一个可以在视图中返回可变数量列的数据表,因此我将 Mvc 3 WebGrid 绑定到 List<dynamic>,如对这篇文章的回答中所述: Populate MVC Webgrid from DataTable

它工作正常,但速度非常慢!“非常慢”是指显示一组包含 11 列的 15 条记录需要 13 秒。有什么办法可以加快这个速度吗?我试过删除寻呼机,但没有效果。

从 Ado.Net 数据表创建 List<dynamic> 的代码如下所示。它运行得非常快,这里没有问题。

var MyList = new List<dynamic>();
foreach (DataRow row in MyTable.Rows)
{
   var expando = (IDictionary<string, object>)new ExpandoObject();
   foreach (string column in columnNames)
   {
       expando.Add(column, row[column]);
   }
   MyList.Add(expando);
}

问题出现在视图中。下面的代码大约需要 13 秒来渲染一组 15 条记录和 11 列!访问数据库并将数据表转换为 List<dynamic> 只需不到一秒的时间。下面的代码需要 13 秒,只是为了渲染。我究竟做错了什么?还是我只是使用 List<dynamic> 找出错误的树?

var grid = new WebGrid(canPage: true, rowsPerPage: Model.PageSize, canSort: false);
 grid.Bind(Model.MyList, rowCount: (int)Model.RowCount, autoSortAndPage: false);
 grid.Pager(WebGridPagerModes.All);
                @grid.GetHtml(tableStyle: "webgrid",
                    rowStyle: "webgrid-row",
                    alternatingRowStyle: "webgrid-alternating-row",
                         htmlAttributes: new { id = "tblSearchResults" },
                         firstText: "<<First",
                         lastText: "Last>>", mode: WebGridPagerModes.All
                )
4

2 回答 2

4

我遇到了同样的问题,这很烦人,因为我们正在加载任意数据。

解决方法是为这些列定义列和格式函数,这将 WebGrid 性能提高了一个巨大的因素,并且性能比没有定义格式的情况(基于列数)要好得多。

例如

IEnumerable<KeyValuePair<string, Object>> example = data.First();
foreach (var pair in example)
    cols.Add(grid.Column(
        columnName: pair.Key,
        //Seems that specifying a formatter saves the web grid ridiculous amounts of time
        format: (item => ((IDictionary<String, Object>)item.Value)[pair.Key])
    ));

有关速度比较和完整示例代码,请参阅我的小示例项目https://github.com/jamesk/MVCWebGridSpeedTest

于 2014-01-15T09:56:59.793 回答
2

你有没有解决这个问题?我们放弃了 WebGrid,转而使用带有 for 循环的直接 html 表格来创建 CSS 样式的列标题和行数据。@Helper 功能是关键,老实说它更容易控制。性能非常好。

            <table id="moduleGrid" summary="@tableSummary">
                <caption>@tableCaption</caption>
                <thead>
                    <tr>
                        @GridColumnHeaders()
                    </tr>
                </thead>
                <tbody>
                    @GridDataRows()
                </tbody>
            </table>
于 2013-10-04T22:38:41.747 回答