Как редактировать динамически генерируемые записи Kendo Grid - PullRequest
0 голосов
/ 12 марта 2020

Я хочу добавить динамические c столбцы к сетке кендо asp. net MVC. И включить функцию редактирования / добавления / удаления. Таким образом, на основе образца здесь я смог отобразить сетку с использованием динамических c столбцов. Поскольку имена столбцов неизвестны во время разработки, я использую IDictionary<string,object>

ВЫПУСК
Когда я редактирую что-то incell и затем нажимаю SaveChanges, метод действия контроллера update контроллера получает правильное количество отредактированных записей с заполнением Key, однако свойство Value остается пустым

Index.cs html

@model IList<Column>

@(Html.Kendo().Grid<dynamic>()
                    .Name("myGrid")                    
                    .Columns(columns =>
                    {                        
                        for (int i = 0; i < Model.Count; i++)
                        {
                            columns.Bound(Model[i].ColumnName);
                        }

                        columns.Command(command => command.Destroy()).Width(100);
                    })
                    .ToolBar(toolbar =>
                    {
                        toolbar.Create();
                        toolbar.Save();
                    })
                    .Editable(editable => editable.Mode(GridEditMode.InCell))
                    .Pageable()
                    .Navigatable()
                    .Sortable()
                    .Scrollable()
                    .Filterable()
                    .AutoBind(true)
                    .DataSource(dataSource => dataSource
                        .Ajax()
                        .Batch(true)
                        .PageSize(20)
                        .ServerOperation(false)                        
                        .Model(model =>
                        {
                            model.Id("Id");
                            var f = model.Field("Id", typeof(int));
                            f.Editable(false);
                        })
                        .Create("Create", "Test")
                        .Read("Get", "Test")
                        .Update("Update", "Test")
                        .Destroy("Delete", "Test")
                    ))

Контроллер

    public class TestController : Controller
    {
        public IActionResult Index()
        {
            var columns = new List<Column>();
            columns.Add(new Column() { ColumnName = "Id" });
            columns.Add(new Column() { ColumnName = "FirstName" });
            columns.Add(new Column() { ColumnName = "LastName" });

            return View(columns);
        }

        [HttpPost]
        public IActionResult Get([DataSourceRequest] DataSourceRequest request)
        {
            var list = new List<Dictionary<string, object>>();
            for (int i = 1; i <= 100; i++)
            {
                var expando = new Dictionary<string, object>();

                expando.Add("Id", i);
                expando.Add("FirstName", Guid.NewGuid().ToString());
                expando.Add("LastName", Guid.NewGuid().ToString());
                list.Add(expando);
            }

            return Json(list.ToDataSourceResult(request));
        }

        [HttpPost]
        public ActionResult Update([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<Dictionary<string, object>> items)
        {
            //ISSUE HERE: receives correct number of edited records with `Key` is populated however 
            //`Value` property remains null



            //TODO: update db
            return Ok();
        }

        [HttpPost]
        public ActionResult Create([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<Dictionary<string, object>> items)
        {
            //TODO: update db
            return Ok();
        }

        [HttpPost]
        public ActionResult Delete([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<Dictionary<string, object>> items)
        {
            //TODO: update db
            return Ok();
        }
    }

Класс столбца

public class Column
{
    public string ColumnName { get; set; }        
}

ОБНОВЛЕНИЕ 1

Я думаю, что это связано с модель привязки. когда я проверяю, какие данные публикуются в фиддлере. Fiddler показывает

sort=&group=&filter=&models%5B0%5D.Id=2&models%5B0%5D.FirstName=foo&models%5B0%5D.LastName=bar

, поэтому я думаю, что механизм связывания по умолчанию не может связать его с IDictionary<string,object>

...