在 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】:下面是一个显示绑定列和模板列的快速示例:
使用@<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);
)
)
希望对您有所帮助,如果还没有弄清楚的话。 :)
UPDATE - 在上面的代码示例中添加了隐式定义的“item”参数。它展示了如何在 Telerik 控件模板中获取模型属性。UPDATE#2 - korchev 在他的代码示例中展示了“@item.someProperty”语法。在我们的例子中不需要 @ 符号,因为我们在扩展方法中,但为了清楚起见,保留它并没有什么坏处。 UPDATE#3 - 添加了 Sample #2 代码示例
【讨论】:
谢谢,看起来是朝着正确方向迈出的一大步,但是您上面的代码省略了链接的“id”路由值。当我尝试添加它们时,出现错误。请查看我的编辑,其中现在包含此内容。 谢谢 Mike,把它包起来了,但是你在对我最初的问题的评论中说 LINQ 表达式没有重载,但我成功地在单独的列上使用了 LINQ 表达式。跨度> 感谢您的坚持,您说得对,模板方法确实支持 Action 委托。我已经添加到上面的代码示例中。 太好了,再次感谢。我想 Razor 的范围规则需要一些时间来适应。 Agrh 尝试了所有方法 columns.Template(@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?