首页 > 解决方案 > 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");
    })
)

标签: c#asp.net-mvcrazor

解决方案


这是我所期待的方向。

对于给定的模型...

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

在这个方向上有什么进一步的见解,有人吗?


推荐阅读