在 Razor 语法中为 Telerik MVC Grid 定义模板列

Posted

技术标签:

【中文标题】在 Razor 语法中为 Telerik MVC Grid 定义模板列【英文标题】:Define a Template column for Telerik MVC Grid in Razor syntax 【发布时间】:2011-05-26 16:13:57 【问题描述】:

我有以下想要模仿的遗留代码,所有操作链接在一列中。但是,我似乎无法正确使用 Razor 语法。我应该如何在 Razor 中表达这一点?

ASPX列模板是这样的:

.Columns(column =>

    column.Template(o =>
        %>
            <%= html.ActionLink("Edit", "Edit", new id = o.DeviceID) %> | 
            <%= Html.ActionLink("Delete", "Delete", new  id = o.DeviceID )%>
        <%);

我只能使用 Razor 获得三个单独的列,而不会抱怨语法等,如下所示:

.Columns(columns =>

    columns.Template(o => @Html.ActionLink("Edit", "Edit", new  id = o.ProductId )).Width(50);
    columns.Template(o => @Html.ActionLink("Details", "Details", new  id = o.ProductId )).Width(50);
    columns.Template(o => @Html.ActionLink("Delete", "Delete", new  id = o.ProductId )).Width(50);

如何使用 Razor 语法定义一个包含所有三个操作链接的模板列?

编辑:在尝试以下对 Mike 答案的小修改时,我收到错误“只有赋值、调用、递增、递减和新对象表达式可以用作语句”:

columns.Template(o => @<text>@Html.ActionLink("Edit", "Edit", new  id = o.CampaignId ) | 
                        @Html.ActionLink("Delete", "Delete", new  id = o.CampaignId )
                        </text>).Width(100);

【问题讨论】:

您正在尝试使用 linq 表达式,但没有重载。请参阅下面的更新 【参考方案1】:

下面是一个显示绑定列和模板列的快速示例:

使用@&lt;text&gt;&lt;/text&gt; 语法的示例#1

@(Html.Telerik().Grid(Model)
    .Name("Grid")
    .Columns(columns =>
    
        columns.Bound(m => m.UserName);
        columns.Bound(m => m.Email);
        columns.Template(@<text> @Html.ActionLink("Edit", "Edit", new  id = item.UserId ) | 
                                 @Html.ActionLink("Delete", "Delete", new  id = item.UserId)  
                         </text>).Width(100);
    )
 )

使用 Action 委托的示例 #2

@(Html.Telerik().Grid(Model)
    .Name("Grid")
    .Columns(columns =>
    
        columns.Bound(m => m.UserName);
        columns.Bound(m => m.Email);
        columns.Template(m => @Html.ActionLink("Edit", "Edit", new  id = m.UserId ) + " | " +
                              @Html.ActionLink("Delete", "Delete", new  id = m.UserId)  
                         ).Width(100);
    )
 )

希望对您有所帮助,如果还没有弄清楚的话。 :)

UPDATE - 在上面的代码示例中添加了隐式定义的“item”参数。它展示了如何在 Telerik 控件模板中获取模型属性。UPDATE#2 - korchev 在他的代码示例中展示了“@item.someProperty”语法。在我们的例子中不需要 @ 符号,因为我们在扩展方法中,但为了清楚起见,保留它并没有什么坏处。 UPDATE#3 - 添加了 Sample #2 代码示例

【讨论】:

谢谢,看起来是朝着正确方向迈出的一大步,但是您上面的代码省略了链接的“id”路由值。当我尝试添加它们时,出现错误。请查看我的编辑,其中现在包含此内容。 谢谢 Mike,把它包起来了,但是你在对我最初的问题的评论中说 LINQ 表达式没有重载,但我成功地在单独的列上使用了 LINQ 表达式。跨度> 感谢您的坚持,您说得对,模板方法确实支持 Action 委托。我已经添加到上面的代码示例中。 太好了,再次感谢。我想 Razor 的范围规则需要一些时间来适应。 Agrh 尝试了所有方法 columns.Template(@@Html.ActionLink("asd", "Configure")); columns.Template(@1212312); columns.Template(x => x.Url + "asdasdasd");但没有任何效果=(它只显示空字段【参考方案2】:
columns.Template(@Html.ActionLink("Edit", "Edit", new id = @item.id ));

查看 ScottGu 关于 Razor 的博客文章,了解 @item 是什么。

【讨论】:

需要此代码的 vb.net 版本 @(Html.Telerik().Grid(Model) .Name("Grid") .Columns(columns => columns.Bound(m => m .UserName); columns.Bound(m => m.Email); columns.Template(m => @Html.ActionLink("Edit", "Edit", new id = m.UserId ) + " | " + @Html.ActionLink("Delete", "Delete", new id = m.UserId) ).Width(100); ) )【参考方案3】:
columns.Command(commands => 
 commands.Custom("Update").Text(Resource.Edit)
 .ButtonType(GridButtonType.BareImage)                                                .SendState(true).SendDataKeys(true).HtmlAttributes(new  id = "popUp")   
                                              Action("Gallery_Bar_EditOrAddTranslate", "Administration").Ajax(false);
commands.Custom("Update").Text(Resource.Edit)
 .ButtonType(GridButtonType.BareImage)                                                .SendState(true).SendDataKeys(true).HtmlAttributes(new  id = "popUp")                                                 Action("Gallery_Bar_EditOrAddTranslate", "Administration").Ajax(false);                                  ).Width("5%").Title(Resource.Coomand);

这将生成类似动作链接的东西 id id = m.UserId 你可以像 DataKeys 一样显示:

 .Name("GridName")  .DataKeys(key =>
                        
                            key.Add(c => c.UserId).RouteKey("userId");

                        )

在 post 方法中,您将拥有:

public ActionResult xxx(int userId)


【讨论】:

【参考方案4】:

如果您使用 ajax 进行绑定,格式必须看起来更像这样:

c.Bound(i => i.Name).ClientTemplate(@Html.ActionLink("<#= Name #>", "[Action]", "[Controller]", new  Id = "<#= Id #>" , new  Area = "[Area]" ).ToHtmlString())

查看这里了解更多信息:http://www.telerik.com/forums/kendo-mvc-grid-actionlink-column

【讨论】:

【参考方案5】:

我有一个打印按钮需要放在标题行中,我选择将其放在与更新按钮所在的同一列中,但在更新按钮所在的位置上方。我能够像这样在 Razor 中做到这一点:

columns.Command(command => command.Edit(); ).Width(100).HeaderTemplate(i => @Html.ActionLink("Print Grid", "OutputAgencies", "Admin", new  @class = "k-button" ) );

这是我的链接按钮上显示“打印网格”的地方,“OutputAgencies”是我的控制器中的一个方法,而“AdminController”是我的控制器的名称。

【讨论】:

以上是关于在 Razor 语法中为 Telerik MVC Grid 定义模板列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 或 ajax 在 c#/asp.net 中为 MVC 项目更新 razor 部分视图

Telerik MVC Grid:如何在列中使用 DropDownList?

浅谈MVC Razor基本语法

在Telerik Kendo UI MVC网格中添加“mailto:”链接

浅谈MVC Razor基本语法

ASP.NET MVC Razor