【问题标题】:Passing bound column value into razor function for MVC Kendo UI Grid将绑定列值传递给 MVC Kendo UI Grid 的 razor 函数
【发布时间】:2016-12-05 07:43:06
【问题描述】:

我需要在 razor 函数中使用绑定列值,该函数在 Kendo UI MVC 网格的 ClientTemplate 中使用。像下面的“AnyColumnValue”参数:

.ClientTemplate(@KendoHtmlFuncs.RequestingDeleteWithConfirmationLink(itemNameL, AnyColumnValue));

完整示例如下:

@(Html.Kendo().Grid<DisplayOfGroupCompanyVm>()
        .Name(itemNameL + "-definitions-grid")
        .Columns(columns =>
        {
        columns.Bound(c => c.Name);
        columns.Bound(c => c.DateCreated).ClientTemplate("#= kendo.toString(DateCreated,'yyyy-MM-dd')#"); //.Width(150);
        columns.Bound(c => c.IsActive);
        columns.Bound(c => c.CreateStatus);

        columns.Template(@<text></text>)
                   .Width(100)
                   .ClientTemplate(@KendoHtmlFuncs.GetModalForRequestingEditLink(itemNameL));
        columns.Template(@<text></text>)
                .Width(100)
                .ClientTemplate(@KendoHtmlFuncs.RequestingDeleteWithConfirmationLink(itemNameL, AnyColumnValue));
        })

【问题讨论】:

  • 什么是 AnyColumnValue?绑定到网格的数据源中的列的实际值?如果是这样,你不能做你想做的事情,因为 KendoHtmlFuncs.RequestingDeleteWithConfirmationLink() 是一个服务器端函数(在 cshtml 渲染期间在服务器上执行)但是 AnyColumnValue 在网格绑定到数据源之前没有值客户端。看起来您必须将 RequestingDeleteWithConfirmationLink() 设为客户端函数...您不能在 ClientTemplate 中执行服务器代码。
  • @TheDreadPirateStephen 谢谢,是的。除此之外,是否有解决方法将列值用作剃刀函数的参数?
  • 我不这么认为,因为服务器上不存在列的值(执行剃刀功能的地方)。您可以使用 ClientTemplate 中的实际列值,因为 ClientTemplate 在呈现行时在客户端上执行,您只是不能调用 Razor 函数,因为它已经在服务器上执行到为视图生成 HTML,然后返回给客户端。请参阅docs.telerik.com/aspnet-mvc/helpers/grid/… 或提供您传递的函数和列的实现,我会尝试写一个答案。

标签: asp.net-mvc razor kendo-ui grid


【解决方案1】:

在@TheDreadPirateStephen 的 cmets 之后进行了一些挖掘,(感谢他)我改变了我的解决方法。他评论的要点是“您不能在 ClientTemplate 中执行服务器代码”。那么下面的解决方法对我来说是可行的。

.ClientTemplate(@KendoHtmlFuncs.RequestingDeleteWithConfirmationLink(itemNameL));

我放弃在 html razor 函数中使用 AnyColumnValue(从绑定到网格的数据源中的列的实际值)。取而代之的是,我在 razor 函数返回的脚本中使用了它。在下面看到的 razor 函数中,HasPermissionForRequestingDelete 变量对应于 AnyColumnValue,属于绑定到网格的模型。

public static string RequestingDeleteWithConfirmationLink(string itemNameL)
    {
        string linkFormat = @"<a {0} class='k-button'>
                                        <i class='fa fa-trash-o'></i> Request For Delete
                              </a>";

        string conditionalPart = @"#if(HasPermissionForRequestingDelete){#
                                        onclick='" + itemNameL + @"_DefinitionsFunc.requestingDelete(this, #= Id #)'
                                   #}else{#
                                       disabled='disabled'
                                   #}#";

        return string.Format(linkFormat, conditionalPart);
    }

【讨论】: