.NET MVC Webgrid with DataTable source
本文关键字:DataTable source with Webgrid MVC NET | 更新日期: 2023-09-27 18:33:38
我有一个MVC应用程序,我需要能够在视图中显示各种记录。为此,我选择了使用内置Webgrid控件的路线。我面临的问题是从数据库中返回的数据表中获取数据,并将其转换为网格的 IEnumerable。我在 SO 上遇到了一种将其转换为列表动态类型的方法,该方法似乎运行良好,但在显示超过 6 列数据时遇到了问题:
public static dynamic serializeToDynamic(DataTable dt)
{
var result = new List<dynamic>();
foreach (System.Data.DataRow row in dt.Rows)
{
var obj = (IDictionary<string, object>)new System.Dynamic.ExpandoObject();
foreach (System.Data.DataColumn col in dt.Columns)
{
obj.Add(col.ColumnName, row[col.ColumnName]);
}
result.Add(obj);
}
return result;
}
我有一个需要显示 28 列的网格,使用这种方法非常慢,页面加载需要近一分钟。我没有成功找到任何替代方案,所以我继续为这些信息制作了一个模型,并将 DataTable 绑定到这个模型,事实证明,在大约 2 秒内加载速度要快得多。我宁愿不必仅仅使用强类型模型来显示这些数据,我的问题是是否有其他方法可以将 DataTable 转换为与 webgrid 一起使用?
如果您只需要任何类型的IEnumerable
,那么您可以使用DataTableExtensions
:
var result = dt.AsEnumerable();
这会给你一个IEnumerable<DataRow>
,它仍然没有强类型对象的好处,但至少是一个IEnumerable
。
这个问题似乎是 asp.net 绑定到List
这最终非常简单。请注意With
扩展函数。
@model DataTable
@{
var columns = Model.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
var s = Model.Rows.Cast<DataRow>().Select(r => new System.Dynamic.ExpandoObject().With(columns.ToDictionary(c => c, c => r[c])));
WebGrid grid = new WebGrid(s, rowsPerPage: 10);
}
由于ExpandoObject
是字典,因此可以使用此扩展函数:
public static object With(this IDictionary<string, object> obj, IDictionary<string,object> additionalProperties)
{
foreach (var name in additionalProperties.Keys)
obj[name] = additionalProperties[name];
return obj;
}