ASP.NET Core中Kendo Grid服务器端模板使用及VS2017报错求助
解决ASP.NET Core Kendo Grid服务器端模板的类型转换错误
这个问题我之前在项目里也踩过坑,其实是ASP.NET Core版本的Kendo Grid和传统MVC写法的小差异导致的。VS抛出的Cannot convert lambda expression to type 'string'错误,本质是Razor在解析服务器端模板时,没有正确识别你的lambda表达式绑定逻辑。下面给你两种最常用的解决方案:
方案一:使用内联Razor模板(推荐)
这是最直观且不易出错的写法,用@<text>包裹模板内容,内部直接通过@item访问当前行的模型属性:
@(Html.Kendo().Grid<YourModel>() .Name("yourGrid") .Columns(columns => { // 这里是你的服务器端模板列 columns.Bound(p => p.ID).Template(@<text> <div class="action-buttons"> <!-- 用@item.ID直接绑定当前行的ID属性 --> <a asp-action="Edit" asp-route-id="@item.ID" class="btn btn-sm btn-primary">编辑</a> <button onclick="deleteRecord(@item.ID)" class="btn btn-sm btn-danger">删除</button> </div> </text>); // 其他列配置... }) // 如果是服务器端绑定,用下面的配置;Ajax绑定则保留Ajax数据源 .DataSource(dataSource => dataSource .Server() .Read(read => read.Action("GetGridData", "YourController")) ) )
注意要点:
- 替换
YourModel为你实际的实体类,确保ID是该类的有效属性 - 模板内部的
@item会自动绑定到当前行的模型实例,无需额外声明 - 如果需要使用HtmlHelper方法(比如
Html.ActionLink),直接在模板内写即可,语法和普通Razor页面一致
方案二:Tag Helper写法(适合偏好HTML风格的开发者)
如果你用的是Kendo Grid的Tag Helper语法,服务器端模板需要通过context获取当前行模型:
<kendo-grid name="yourGrid"> <columns> <column field="ID"> <template> @{ // 先将context转换为你的模型类型 var currentItem = context as YourModel; } <a asp-action="Details" asp-route-id="@currentItem.ID">查看详情</a> </template> </column> <!-- 其他列... --> </columns> <!-- 服务器端绑定数据源 --> <datasource type="DataSourceTagHelperType.Server"> <transport> <read url="@Url.Action("GetGridData", "YourController")" /> </transport> </datasource> </kendo-grid>
避坑提醒
- 不要混淆服务器端模板和客户端模板:服务器端模板用
Template()(或Tag Helper的<template>),绑定用@item/@currentItem;客户端模板用ClientTemplate(),绑定用#= ID #语法 - 如果你的Grid是Ajax绑定,服务器端模板只会在首次渲染时生效,后续分页/筛选后会用客户端模板(如果配置了的话),这点要根据业务场景选择
- 确保VS的Razor语法检查正常,有时候清理项目缓存(右键项目→清理)可以解决一些奇怪的语法提示错误
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

