Kendo MVC Grid无法调用控制器异步Task Action方法的解决问询
解决方案
错误根源在于控制器的异步Action中未正确处理Kendo的异步数据源转换方法,导致返回的Task未被正确await执行。以下是修正步骤:
1. 修正控制器Action方法
将ToDataSourceResultAsync的调用改为异步等待,并规范异步Action的返回逻辑:
public async Task<ActionResult> MyActionMethod([DataSourceRequest] DataSourceRequest request) { var data = await _service.GetData(); var model = data.Select((item, index) => new MyModel { MyData = ...... // 你的字段赋值逻辑 }); // 异步等待数据源结果转换 var result = await model.ToDataSourceResultAsync(request); // 使用框架内置Json方法返回结果 return Json(result, JsonRequestBehavior.AllowGet); }
关键修改点:
- 必须用
await等待model.ToDataSourceResultAsync(request)执行完成,避免直接返回未完成的Task对象 - 若需要设置
MaxJsonLength,可手动实例化JsonResult并传入已await的结果:var result = await model.ToDataSourceResultAsync(request); return new JsonResult { Data = result, MaxJsonLength = int.MaxValue, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
2. Grid控件配置无需修改
你的Kendo Grid现有配置完全正确,保持原样即可:
@(Html.Kendo().Grid<MyModel>() .Name("mygriddata") .Columns(column => { column.Bound(model => model.MyData).Title("No.")..... }) .Pageable(x => x.PageSizes(true).ButtonCount(3).Responsive(false)) .AutoBind(false) .Filterable() .Sortable(x => x.Enabled(true)) .Resizable(resizable => resizable.Columns(true)) .Scrollable(x => x.Height("auto")) .PersistSelection() .HtmlAttributes(new { style = "height: 50vh; margin-left:10px", @class = "form-group" }) .NoRecords() .DataSource(dataSource => dataSource .Ajax() .ServerOperation(true) .Model(model => { model.Id(item => item.ID); }) .Read(read => read.Action("MyActionMethod", "MyController")) ) )
补充说明:
- Kendo MVC的
ToDataSourceResultAsync是异步方法,必须配合await使用,否则会返回未完成的Task实例,导致ASP.NET无法正确处理异步Action的结果 - 确保项目引用的Kendo.Mvc程序集为较新版本,避免异步方法的兼容性问题
内容的提问来源于stack exchange,提问作者NoName
相关产品推荐
相关产品推荐

