ASP.NET Core Kendo UI Grid自定义命令模板失效问题
解决ASP.NET Core中Kendo UI Grid自定义命令模板URL绑定失效问题
你碰到的这个问题其实很常见,核心原因是Razor服务器端解析和Kendo客户端模板语法的执行顺序冲突了。
你用@Html.ActionLink的时候,这个Razor辅助方法会在服务器端先运行,这时候Kendo的#: NameEn#模板语法还没机会生效,服务器直接把它当成了普通字符串处理,最终就出现了编码后的%23%3A%20NameEn%23这种奇怪的URL片段。
给你两种实用的解决办法,选哪种都可以:
方法一:改用纯客户端链接(推荐)
直接写原生的<a>标签,用Kendo模板语法绑定href属性,让客户端渲染时替换变量:
<script id="commandsTemplate" type="text/x-kendo-template"> <div class='dropdown dropdown-inline'> <button type='button' class='btn btn-hover-brand btn-elevate-hover btn-icon btn-sm btn-icon-md' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'> <i class='flaticon-more-1'></i> </button> <div class='dropdown-menu dropdown-menu-right'> <a href='/Blabla/Details/#: NameEn#' class='dropdown-item'>Edit</a> </div> </div> </script>
如果你的项目用了自定义路由,不想硬写路径,可以先用Razor的Url.Action拿到基础路由,再拼接Kendo模板变量:
<a href='@Url.Action("Details", "Blabla")/#: NameEn#' class='dropdown-item'>Edit</a>
这样既保留了路由的灵活性,又能让Kendo正确替换行数据里的NameEn值。
方法二:保留Html.ActionLink(需处理Razor解析)
如果一定要用Html.ActionLink,可以用@Html.Raw来避免Razor把Kendo模板语法转义,同时把模板变量嵌入到链接里:
<script id="commandsTemplate" type="text/x-kendo-template"> <div class='dropdown dropdown-inline'> <button type='button' class='btn btn-hover-brand btn-elevate-hover btn-icon btn-sm btn-icon-md' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'> <i class='flaticon-more-1'></i> </button> <div class='dropdown-menu dropdown-menu-right'> @Html.Raw($"<a href='{Url.Action("Details", "Blabla")}/#: NameEn#' class='dropdown-item'>Edit</a>") </div> </div> </script>
@Html.Raw的作用是告诉Razor不要把里面的HTML标签转义成实体,确保客户端能正确识别Kendo的模板语法。
额外注意点
- 确认你的Grid数据源里确实存在
NameEn字段,并且字段名大小写和模板里的完全一致(Kendo模板是区分大小写的); - Kendo的
#: #语法会自动对变量进行HTML编码,能有效避免XSS风险,不用额外处理特殊字符。
内容的提问来源于stack exchange,提问作者HoseiniPeyrov
相关产品推荐
相关产品推荐

