问题描述
我正在为 MVC5 应用程序构建一个用于查找表管理的接口。每个查找都封装在它自己的模型中。希望/想法是我可以将我选择的任何模型动态输入到包含 MVC.Grid 的单个 Razor 页面中。不幸的是,MVC.Grid 的语法要求我对给定模型的属性进行硬编码。
@model IQueryable<Person>
@(Html
.Grid(Model)
.Build(columns =>
{
columns.Add(model => model.Name).Titled("Name");
columns.Add(model => model.Surname).Titled("Surname");
columns.Add(model => model.MaritalStatus).Titled("Marital status");
})
)
解决方法
要简单地在包含所有列的视图中显示网格,您只需在声明的 GetHTML
的视图中使用 WebGrid
:
@model IQueryable <Person>
@{
WebGrid grid = new WebGrid(Model);
}
<div>@grid.GetHtml()</div>
编辑:有更多选择
@model IQueryable <Person>
@{
WebGrid grid = new WebGrid(Model,rowsPerPage: 10,canSort: true);
}
<div>
@grid.GetHtml(
tableStyle : "table table-responsive table-striped table-bordered",htmlAttributes: new
{
id = "grid1"
})
</div>
如您所见,您可以在 C# 代码中自定义网格行为以进行排序、限制行数...等。 还可以通过将一些样式应用于网格、提供 Id 等来为您的 HTML 设置样式。
您可以查看这两个链接以了解更多信息,因为有很多选项无法在单个帖子中显示。
Microsoft WebGrid.GetHtml Method
MVC Webgrid basics – Simple grid with paging and sorting and selection
,MVC.Grid 页面上的一个示例是使用数据表完成的,如果可能,您可以使用它。
除此之外,它归结为创建一个以某种方式访问数据的表达式。您可以使用您自己的以列名作为键的数据结构,您可以使用 .NET 表达式生成器等创建动态表达式。
@(Html
.Grid(Model.Rows)
.Build(columns =>
{
foreach (var column in Model.DynamicColumns)
{
columns.Add(model => model.GetValueFor(column.Name)).Titled(column.Label);
}
// or
foreach (var column in Model.DynamicColumns)
{
columns.Add(column.BuildDataAccessExpression()).Titled(column.Label);
}
})
)
如果 .Add(...)
方法不支持您的表达式,您可以使用限制较少的函数 api 代替 .Add().RenderedAs(...)
。
这里有一些更符合我预期的东西。
对于给定的模型...
public class Person
{
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Marital Status")]
public string MaritalStatus { get; set; }
[Display(Name = "Years Married")]
public int Years { get; set; }
}
我可以几乎像这样为模型的每个属性动态添加一列:
@model IQueryable<Person>
@(Html
.Grid(Model)
.Build(columns =>
{
foreach (var column in typeof(Person).GetProperties())
{
var type = typeof(Person);
var memInfo = type.GetMember(column.Name);
var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute),false);
var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;
columns.Add(m => m.GetType().GetProperty(column.Name).GetValue(m)).Titled(displayname);
}
})
.Filterable()
.Sortable()
)
然而……过滤和排序已经消失了,现在我不再对列进行硬编码。通过 JavaScript 添加事件侦听器现在也失败了。模型属性的动态解析破坏了某些东西...强类型,也许?
有人对这个方向有进一步的了解吗?