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

15

我有以下遗留代码,希望将所有操作链接放在一个列中进行模拟。但是,我似乎无法正确使用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表达式,但是没有对应的重载。请看下面我的更新。 - mikekidder
5个回答

27

下面是一个快速示例,展示了绑定列和模板列:

使用@<text></text>语法的示例 #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);
    })
 )

希望这能帮到你,如果你还没有解决问题 :)

更新 - 在上面的代码示例中添加了隐含定义的"item"参数。它展示了如何在Telerik控件模板中获取模型属性。
更新#2 - korchev 在他的代码示例中展示了"@item.someProperty"语法。对于我们来说,由于我们在扩展方法内部,不需要使用@符号,但为了清晰起见,保留它也无妨。 更新#3 - 添加了第二个示例代码样本


谢谢,看起来是朝着正确方向迈出的好步骤,但是你上面的代码省略了链接的'id'路由值。当我尝试添加它们时,会出现错误。请查看我的编辑,现在已经包括了这个。 - ProfK
谢谢Mike,你解决了我的问题。但是你在评论中说LINQ表达式没有重载,但我成功地在不同的列上使用了LINQ表达式。 - ProfK
1
感谢您的坚持,您是正确的,模板方法确实支持Action委托。我已经在上面的代码示例中添加了它。 - mikekidder
太好了,再次感谢。我想Razor的作用域规则需要一些时间来适应。 - ProfK
这个功能非常好,但是当我对某一列进行排序时,所有的链接都会消失? - Matt
2
尝试了所有方法,但都不行=( 它只显示空字段。columns.Template(@<text>@Html.ActionLink("asd", "Configure")</text>); columns.Template(@<text>1212312</text>); columns.Template(x => x.Url + "asdasdasd"); - Vladimirs

2
如果您正在使用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


1
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", new { id = m.UserId} ) + " | " + @Html.ActionLink("删除", "Delete", new { id = m.UserId})
).Width(100); }) )
- moss

0
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为m.UserId,您可以像DataKeys一样显示:

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

                        })

在 post 方法中,你将会有:

public ActionResult xxx(int userId)
{
}

0

我需要在页眉行放置一个“打印”按钮,我选择将其放置在与更新按钮相同的列上方。我可以像这样在 Razor 中很好地完成它:

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

这里是我的链接按钮上显示“Print Grid”的位置,“OutputAgencies”是我的控制器中的一个方法,“AdminController”是我的控制器名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接