如何从 Kendo.Grid 的 ClientTemplate 内部向 JavaScript 函数发送参数?

Posted

技术标签:

【中文标题】如何从 Kendo.Grid 的 ClientTemplate 内部向 JavaScript 函数发送参数?【英文标题】:How to send parameters to JavaScript function from inside of a ClientTemplate of a Kendo.Grid? 【发布时间】:2020-11-17 23:36:48 【问题描述】:

我的视图有一个带有 ClientTemplate 的 Kendo Grid,按以下方式为列定义:

.ClientTemplate("<button type ='button' class='k-button btn-icon-sm btn-view-detail' id='btnTicketDetail'  onclick='showDetails(this)'><span class='k-icon k-i-file-txt'></span></button>#=data.TicketId#");

以上代码调用javascript函数showDetails

此功能与剑道网格在同一视图中定义:

function showDetails(e) 
    var grid = $("#VarianceTicket").data("kendoGrid");
    var row = $(e).closest("tr");
    var rowIdx = $("tr", grid.tbody).index(row);
    var item = grid.dataItem(row);
    var ticketDetailsUrl = "@Url.Action("Index", "VarianceTicketDetail", new System.Web.Routing.RouteValueDictionary(new  id = "data" ), Request.Url.Scheme)".replace("data", item.TicketId);
    var newURL = ticketDetailsUrl;
    window.open(newURL, '_blank');

现在,我需要将该函数移动到一个通用的 Site.js 文件中。

当我这样做时,函数中的以下行不正确:

var ticketDetailsUrl = "@Url.Action("Index", "VarianceTicketDetail", new System.Web.Routing.RouteValueDictionary(new  id = "data" ), Request.Url.Scheme)".replace("data", item.TicketId);

看起来是这样的:

基本上,如我所见,它无法构建@Url.Action 字符串。

我应该怎么做才能确保它有效?

【问题讨论】:

【参考方案1】:

您可以更改 showDetails 方法以接受 url 作为参数,并更新您的 ClientTemplate 以使用 @Url.Action 传递该参数。像这样:

ShowDetails 方法:

function showDetails(e, url) 
    var grid = $("#VarianceTicket").data("kendoGrid");
    var row = $(e).closest("tr");
    var rowIdx = $("tr", grid.tbody).index(row);
    var item = grid.dataItem(row);
    var ticketDetailsUrl = url;
    var newURL = ticketDetailsUrl;
    window.open(newURL, '_blank');

ClientTemplate(使用字符串连接并添加空行以提高可读性,格式可能需要调整,我现在无法在本地测试):

.ClientTemplate("<button type ='button' class='k-button btn-icon-sm btn-view-detail' id='btnTicketDetail'  onclick='showDetails(this, " + 

Url.Action("Index", "VarianceTicketDetail", new System.Web.Routing.RouteValueDictionary(new  id = "data" ), Request.Url.Scheme)".replace("data", #=data.TicketId#) +

")'><span class='k-icon k-i-file-txt'></span></button>#=data.TicketId#");

我已将 ClientTemplate 更改为以下逻辑: .ClientTemplate("&lt;button type ='button' class='k-button btn-icon-sm btn-view-detail' id='btnTicketDetail' onclick='showDetails(this, " + Url.Action("Index", "VarianceTicketDetail", new System.Web.Routing.RouteValueDictionary(new id = "data" ), Request.Url.Scheme) + ")'&gt;&lt;span class='k-icon k-i-file-txt'&gt;&lt;/span&gt;&lt;/button&gt;#=data.TicketId#");

我将替换 showDetails 函数内的 data 部分

【讨论】:

得到 JavaScript 错误 Uncaught SyntaxError: missing ) after argument list 就像我说的格式可能需要调整。 :) 我看到您的编辑,您提到您将替换 showDetails 函数内的数据部分。为什么不直接将 id 设置为模板中的正确 ID?像这样:new id = #=data.TicketId# 这样做很有意义。谢谢 如果我只是将TicketID 作为参数传递给函数,并且函数内部会将票证ID附加到url:showDetails("#=data.TicketId#") 您可以这样做,但是当您将 id 附加到 javascript 函数中的 url 时,您将无法使用 Url.Action 来帮助构建该 URL(假设您正在使用一个独立的js文件)

以上是关于如何从 Kendo.Grid 的 ClientTemplate 内部向 JavaScript 函数发送参数?的主要内容,如果未能解决你的问题,请参考以下文章

从 Kendo DatePicker Inside Kendo Grid 中选择的日期格式

从其 DataSource 获取 Kendo Grid

Kendo Grid:如何使用列模板以便编辑器始终可用?

从 Kendo Grid 数据源导出所有数据

Telerik Kendo Grid 重新绑定问题

从错误处理程序中获取对 Kendo Grid 的引用