Kendo ASP.NET MVC помощник Grid универсальный класс

У меня следующая дилемма:

Я пытаюсь создать Kendo UI Grid в частичном представлении, которое будет использоваться с различными типами объектов и которое может поддерживать такие действия, как удаление или создание.

Объект выглядит так:

public class GridViewModel
{
    public Type ObjectType { get; set; }
    public IEnumerable Items { get; set; }

    public GridViewModel(Type type, IEnumerable items)
    {
        Items = items;
        ObjectType = type;
    }
}

ObjectType - это переменная типа Type, которая сохраняет тип класса. Например, Сотрудник, Продукт, Счет или что-то еще.

Предметы - это IEnumerable список объектов ранее упомянутого типа.

Допустим, у нас есть представление Employee, и мы звоним в следующем:

@model IEnumerable
@{
    GridViewModel gridModel = new GridViewModel(typeof(Employee), Model);
}
@{
    Html.RenderPartial("_AdvancedGrid", gridModel);
}

Таким образом мы загружаем частичное представление с указанным объектом в качестве модели.

Теперь Kendo UI Grid внутри частичного представления:

@model XMLProject.Models.GridViewModel
@{
     System.Reflection.PropertyInfo[] propertyArray = Model.ObjectType.GetProperties();
}
@(Html.Kendo().Grid()
    .Name("Grid")
    .Columns(columns =>
    {
        foreach (var property in propertyArray)
        {
            columns.Bound(property.Name);
        }
        columns.Command(c => c.Destroy());
    })
    .ToolBar(toolbar => toolbar.Create())
    .Groupable()
    .Pageable()
    .Sortable()
    .Scrollable()
    .Filterable()
    .Editable(editable => editable.Mode(GridEditMode.InLine))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Model(model => model.Id("Id"))
        .Destroy(update => update.Action("Delete", "Products"))
        .Read(read => read.Action(ViewBag.PageLayout.ReadDataActionName, ViewBag.PageLayout.ControllerName))
        .Update(update => update.Action("Products_Update", "Home"))
        .Create(create => create.Action("Products_Create", "Home"))
        )
)

Как вы можете видеть, я использую Grid < Сотрудник>.

Но это неверно, так как я хочу использовать Grid <'любой тип объекта '>, но синтаксис не позволит мне дать ему строку, а затем изменить его на тип класса. Я пробовал такие вещи, как:

Html.Kendo().Grid
Html.Kendo().Grid

... и другие глупые способы.

Мой последний вопрос: могу ли я каким-то образом обмануть компилятор, чтобы увидеть строку или что-то подобное в виде класса из проекта.

Я также попробовал что-то вроде:

Html.Kendo().Grid

Это работает, но это означает, что ЛЮБОЙ объект, который я хочу использовать в сетке, ДОЛЖЕН иметь все поля интерфейса Product.

В качестве заключительного замечания я выполнил эту работу, но без реализации каких-либо действий удаления / создания / обновления, встроенных в сетку, используя другой синтаксис, такой как:

@(Html.Kendo().Grid(Model.Items)    
    .Name("Grid")
    .Columns(columns =>
    {
        foreach (var property in propertyArray)
        {
            columns.Bound(property.Name);
        }
    })
    .Groupable()
    .Pageable()
    .Sortable()
    .Scrollable()
    .Filterable()
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action(ViewBag.PageLayout.ReadDataActionName, ViewBag.PageLayout.ControllerName))
    )
)

ОБНОВИТЬ:

Я нашел решение.

@model GridViewModel
@using Kendo.Mvc.UI;

@{
    System.Reflection.PropertyInfo[] propertyArray = Model.ObjectType.GetProperties();
    List mockList = new List();
}

@(Html.Kendo().Grid(mockList)
    .Name("Grid")
    .Columns(columns =>
    {
        foreach (var property in propertyArray)
        {
            columns.Bound(property.Name);
        }
        columns.Command(c => c.Custom("Delete").Click("kendoGrid.onDeleteButtonClicked"));
        columns.Command(c => c.Custom("Edit").Click("kendoGrid.onEditButtonClicked"));
    })
    .Groupable()
    .Pageable()
    .Sortable()
    .Scrollable()
    .Filterable()
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action(Model.ReadDataActionName, ViewBag.PageLayout.ControllerName))
    )
)

Что я сделал, так это избавился от всех бесполезных стандартных функций вроде Destroy или Create, предоставляемых Kendo, потому что им требовался синтакс с Grid < 'тип объекта ' >.

Объект GridViewModel теперь выглядит так:

public class GridViewModel
{
    public Type ObjectType { get; set; }
    public string ReadDataActionName { get; set; }

    public GridViewModel(Type type, string actionName)
    {
        ObjectType = type;
        ReadDataActionName = actionName;
    }
}

где ReadDataActionName - имя действия, отвечающее за возвращение списка объектов Json, которые может прочитать сетка Kendo.

Затем я создал пользовательские команды, которые указывают на пользовательские функции, созданные в Jquery, которые отправляют в качестве параметра довольно сложный объект, который имеет (помимо всего прочего) объект Json из сетки, на которую я нажал.

В конце концов, самым важным является функция .Read в источнике данных. Это должно указывать на функцию, которая возвращает специальный тип Json (см. Документацию Kendo для типа Json, которое ваше действие должно возвращать на примерах их демонстраций).

Итак, вы нене нужен массив объектов, как вывидел:

@(Html.Kendo().Grid(mockList)
    ...
)

где mocklist - список объектов (пустых и одиноких - просто чтобы обмануть функцию, которая победила)т работать иначе).

И, наконец, результатом является то, что у меня есть общая сетка, которая принимает любой массив объектов с кнопками «Удалить» и «Редактировать», которые указывают на функции, которые можно настроить в соответствии со своими предпочтениями - он может открыть всплывающее окно с данными из частичного представления полный вид или все, что вы хотите. Я даже настроил функцию удаления, чтобы удалить запись Ajax без какого-либо подтверждения от пользователя, и она полностью работает.

Ответы на вопрос(0)

Ваш ответ на вопрос