Я хочу добавить динамические 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>