模型绑定因 Kendo 网格而失败
Model Binding fails with Kendo Grid
我无法使用 Kendo 网格的编辑和创建命令,因为绑定总是失败并且控制器总是接收到 null
对象,即使 DataSourceRequest
没问题。
我用了 @html.EditorForModel()
,它工作正常,控制器收到了数据。所以 MVC 模型绑定和我的 class 不是问题。
此外,使用 F12,我可以看到正在 post 编辑的数据,这也很好。
对可能出现的问题和调试有什么想法吗?我所有的 Kendo 网格都有问题,有时它们 post 一个模型两次,我在服务器上收到双 Create
,其中一个总是因为重复的键而失败。或者有时创建也会被编辑命令触发。
我不知道我哪里出错了,在大多数情况下,用户也会选择主键,所以我返回的模型不需要更新。
对于这个特定的 class,服务器总是收到两个创建并且 none 正确绑定。第一个创建 posts 所有字段,第二个 posts 所有导航属性字段!
这是动作方法:
[HttpPost]
public ActionResult Create([DataSourceRequest] DataSourceRequest request, Stock stock){
if (stock != null && ModelState.IsValid)
{
repo.Insert(stock);
return Json(new[] { stock }.ToDataSourceResult(request, ModelState));
}
else
return Json(null);
}
和网格:
@(Html.Kendo().Grid<Stock>()
.Name("stock")
.Columns(columns =>
{
columns.ForeignKey(x => x.CGoodCode, (IEnumerable)ViewData["Goods"], "Id", "Text");
///
columns.Command(command => { command.Edit(); command.Destroy(); });
})
.ToolBar(toolbar => {
toolbar.Create();
toolbar.Excel();
toolbar.Pdf();
})
.Editable(edit => edit.Mode(GridEditMode.PopUp))
.Sortable()
.Pageable(p => p.PageSizes(true))
.DataSource(ds =>
ds.Ajax()
.Model(model => {
model.Id(x => x.CGoodCode);
model.Id(x => x.SWhCode);
model.Id(x => x.LiIdPeriod);
model.Field(x => x.CGoodCode).DefaultValue(ViewData["GoodsDefault"]);
////
})
.Read("Read", "Stock")
.Update("Edit", "Stock")
.Create("Create", "Stock")
.Destroy("Delete", "Stock")
)
)
更新
似乎Kendo Grid 还不支持composite primary keys!
This question帮了我大忙!我只需要将参数重命名为:
public ActionResult Create([DataSourceRequest] DataSourceRequest request, Stock somethingElse){
因为我的 class 包含一些具有该名称的字段,Stock!
我无法使用 Kendo 网格的编辑和创建命令,因为绑定总是失败并且控制器总是接收到 null
对象,即使 DataSourceRequest
没问题。
我用了 @html.EditorForModel()
,它工作正常,控制器收到了数据。所以 MVC 模型绑定和我的 class 不是问题。
此外,使用 F12,我可以看到正在 post 编辑的数据,这也很好。
对可能出现的问题和调试有什么想法吗?我所有的 Kendo 网格都有问题,有时它们 post 一个模型两次,我在服务器上收到双 Create
,其中一个总是因为重复的键而失败。或者有时创建也会被编辑命令触发。
我不知道我哪里出错了,在大多数情况下,用户也会选择主键,所以我返回的模型不需要更新。
对于这个特定的 class,服务器总是收到两个创建并且 none 正确绑定。第一个创建 posts 所有字段,第二个 posts 所有导航属性字段!
这是动作方法:
[HttpPost]
public ActionResult Create([DataSourceRequest] DataSourceRequest request, Stock stock){
if (stock != null && ModelState.IsValid)
{
repo.Insert(stock);
return Json(new[] { stock }.ToDataSourceResult(request, ModelState));
}
else
return Json(null);
}
和网格:
@(Html.Kendo().Grid<Stock>()
.Name("stock")
.Columns(columns =>
{
columns.ForeignKey(x => x.CGoodCode, (IEnumerable)ViewData["Goods"], "Id", "Text");
///
columns.Command(command => { command.Edit(); command.Destroy(); });
})
.ToolBar(toolbar => {
toolbar.Create();
toolbar.Excel();
toolbar.Pdf();
})
.Editable(edit => edit.Mode(GridEditMode.PopUp))
.Sortable()
.Pageable(p => p.PageSizes(true))
.DataSource(ds =>
ds.Ajax()
.Model(model => {
model.Id(x => x.CGoodCode);
model.Id(x => x.SWhCode);
model.Id(x => x.LiIdPeriod);
model.Field(x => x.CGoodCode).DefaultValue(ViewData["GoodsDefault"]);
////
})
.Read("Read", "Stock")
.Update("Edit", "Stock")
.Create("Create", "Stock")
.Destroy("Delete", "Stock")
)
)
更新
似乎Kendo Grid 还不支持composite primary keys!
This question帮了我大忙!我只需要将参数重命名为:
public ActionResult Create([DataSourceRequest] DataSourceRequest request, Stock somethingElse){
因为我的 class 包含一些具有该名称的字段,Stock!