Kendo Grid更新时未向MVC控制器传递数据问题求助
Kendo Grid批量更新控制器接收不到数据的解决方法
问题场景
配置了单元格内编辑(GridEditMode.InCell)和批量保存按钮的Kendo Grid,加载数据正常,但点击「保存更改」后,MVC控制器的yearData参数始终为null。
解决步骤
1. 匹配Kendo默认的批量提交参数名
Kendo Grid批量更新时,默认会将修改的数据集合以models作为参数名提交到控制器。你需要将控制器方法的参数名从yearData改为models:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult EditingCustom_Update([DataSourceRequest] DataSourceRequest request, IEnumerable<Article7YearsViewModel> models) { if (models != null && ModelState.IsValid) { foreach (var record in models) { var ID = record.ID; var SetType = record.SetType; } } return Json(models.ToDataSourceResult(request, ModelState)); }
如果不想修改参数名,也可以通过自定义JS函数序列化数据,指定参数名:
function serializeBatchData(data) { return { yearData: data.models }; }
然后在Grid的DataSource配置中绑定这个序列化函数:
.Update(update => update.Action("EditingCustom_Update", "Case").Data("serializeBatchData"))
2. 启用DataSource的批量操作模式
InCell编辑模式下的批量保存需要明确启用批量操作,在Ajax数据源配置中添加.Batch(true):
.DataSource(dataSource => dataSource .Ajax() .Batch(true) // 必须启用批量模式,否则不会打包提交多条修改数据 .PageSize(1000) .Model(model => { model.Id(p => p.ID); model.Field(p => p.SetType); model.Field(p => p.SetYears); model.Field(p => p.SetDate); model.Field(p => p.OrderDate); model.Field(p => p.Amount); model.Field(p => p.RefundSavings); model.Field(p => p.Notes); }) .Read(read => { read.Action("Article7YearsFetch", "Case").Data("BuildObject"); }) .Create(create => create.Action("EditingCustom_Create", "Case")) .Update(update => update.Action("EditingCustom_Update", "Case")) )
3. 确保ViewModel的模型绑定兼容性
- 确认ViewModel的所有属性都有公共的
get和set方法(你的ViewModel已满足)。 - 日期字段需保证格式匹配,可在ViewModel的日期属性上添加格式化特性:
[DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] public DateTime? SetDate { get; set; } [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] public DateTime? OrderDate { get; set; }
4. 排查模型绑定错误
如果以上配置后仍接收不到数据,可通过查看ModelState的错误信息定位问题:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult EditingCustom_Update([DataSourceRequest] DataSourceRequest request, IEnumerable<Article7YearsViewModel> models) { // 输出所有模型绑定错误 foreach (var key in ModelState.Keys) { var state = ModelState[key]; foreach (var error in state.Errors) { System.Diagnostics.Debug.WriteLine($"绑定错误:{key} - {error.ErrorMessage}"); } } if (models != null && ModelState.IsValid) { foreach (var record in models) { var ID = record.ID; var SetType = record.SetType; } } return Json(models.ToDataSourceResult(request, ModelState)); }
内容的提问来源于stack exchange,提问作者Jonathan Small
相关产品推荐
相关产品推荐

