MVC.Grid 是否可以使用动态列?

问题描述

我正在为 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 添加事件侦听器现在也失败了。模型属性的动态解析破坏了某些东西...强类型,也许?

有人对这个方向有进一步的了解吗?