【问题标题】:Generic Kendo MVC Grid Used with Different Models用于不同模型的通用 Kendo MVC 网格
【发布时间】:2022-03-04 05:35:58
【问题描述】:

我正在尝试将 Kendo Grid 一般用作局部视图。 Kendo 需要定义类型或数据表才能在 razor 视图中实例化网格

@(Html.Kendo().Grid<object>() or @(Html.Kendo().Grid(dataTable)

我的问题是我想将 Grid 用于任何对象,而不是特定对象。

@(Html.Kendo().Grid<object>()
    .Name(Model.MetricName)
    .Resizable(resizing => resizing.Columns(true))
    .Reorderable(reorder => reorder.Columns(true))
    .Sortable(sorting => sorting.Enabled(true))
    .Pageable(pager => pager.PageSizes(new int[] { 10, 15, 20, 50 }))
    .ColumnMenu()
    .DataSource(dataSource => dataSource
            .Ajax()
            .Read(read => read.Action(Model.MetricName, "AdHocReport", new { metricId = Model.MetricId }))
    )

)

通过使用 Object,我能够动态加载从 ajax .read 方法返回的数据。然而,问题在于日期。它们以 JSON 格式返回。

我试过这个方法,我仍然得到日期的 JSON 字符串表示

Kendo ASP.NET MVC helper Grid generic class

有没有办法从类型的字符串表示中定义网格的类型?所以假设我在 viewModel 上有一个字符串属性,它是网格的类型。我怎么说网格?

我尝试使用反射来实例化类型,但我得到了臭名昭著的“你正在使用像类型这样的变量”

这让我发疯了......任何和所有的帮助将不胜感激

【问题讨论】:

  • 恐怕剑道网格和它的 MVC 包装器不是为此而设计的。你必须做类似this

标签: asp.net-mvc generics reflection kendo-ui kendo-grid


【解决方案1】:

所以我找到了使这项工作正常工作并正确绑定的方法,如上所述,我的 mrmashal 与使用 dataTables 有关。

@(Html.Kendo().Grid(Model.GridTable)

这里是 viewModel 属性

public DataTable GridTable { get; set; }

为了使这种动态化,我使用反射来根据我想要填充网格的类的属性来定义数据表

Type elementType = Type.GetType(className, true);
var properties = elementType.GetProperties();

DataTable dataTable = new DataTable();
foreach (PropertyInfo info in properties)
    {
        dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
    }
viewModel.GridTable = dataTable;

但是,关键是确保从 AJAX 读取返回的数据是一个数据表,而不是 IEnumerable 类型。

DataTable dataTable = ToDataTable<AssetLocationHistoryMetricData>(metricData);

var result = dataTable.ToDataSourceResult(request);

这就是我用来将列表转换为数据表的方法

public static DataTable ToDataTable<T>(IEnumerable<T> items)
    {
        DataTable dataTable = new DataTable(typeof(T).Name);

        //Get all the properties
        PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in Props)
        {
            //Setting column names as Property names
            dataTable.Columns.Add(prop.Name);
        }
        foreach (T item in items)
        {
            var values = new object[Props.Length];
            for (int i = 0; i < Props.Length; i++)
            {
                //inserting property values to datatable rows
                values[i] = Props[i].GetValue(item, null);
            }
            dataTable.Rows.Add(values);
        }
        //put a breakpoint here and check datatable
        return dataTable;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多