15

I have the following legacy code that I would like to mimic, with all action links inside one column. However, I can't seem to get the Razor syntax right. How should I express this in Razor?

The ASPX column template is like this:

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

I have only been able to get three separate columns using Razor without complaints about syntax etc. as below:

.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);

How can I define one template column that contains all three action links using Razor syntax?

EDIT: In trying the following small adaptation of Mike's answer below, I get the error "Only assignment, call, increment, decrement, and new object expressions can be used as a statement":

columns.Template(o => @<text>@Html.ActionLink("Edit", "Edit", new { id = o.CampaignId }) | 
                        @Html.ActionLink("Delete", "Delete", new { id = o.CampaignId })
                        </text>).Width(100);
ProfK
  • 49,207
  • 121
  • 399
  • 775

5 Answers5

27

Here is a quick sample showing both bound columns and a template column:

Sample #1 using @<text></text> syntax

@(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);
    })
 )

Sample #2 using an Action delegate

@(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);
    })
 )

Hope that helps, if didn't already figure it out. :)

UPDATE - added the implicitly defined "item" parameter in code sample above. It shows how to get the Model properties within the Telerik control template.
UPDATE#2 - korchev showed the "@item.someProperty" syntax within his code sample. The @ symbol is not needed in our case since we are within an extension method, but doesn't hurt to leave it for clarity. UPDATE#3 - added Sample #2 code sample

mikekidder
  • 888
  • 8
  • 13
  • thanks, looks like a good step in the right direction, but your code above omits the 'id' routing values for the links. When I try and add them, I get an error. Please see my edit which now includes this. – ProfK Dec 18 '10 at 08:08
  • Thanks Mike, that wrapped it up, but you said in your comment to my original question that there is no overload for a LINQ expression, but I was successfully using LINQ expressions on the separate columns. – ProfK Dec 19 '10 at 12:01
  • 1
    thanks for your persistence, and you're right that the template method does in fact support Action delegates. I've added to my code sample above. – mikekidder Dec 19 '10 at 22:40
  • Great, thanks again. I guess the scoping rules for Razor take some getting used to. – ProfK Dec 20 '10 at 09:41
  • This works well, BUT, when I then sort a column, all my links vanish? – Matt Oct 10 '12 at 20:16
  • 2
    Agrh tried everything columns.Template(@@Html.ActionLink("asd", "Configure")); columns.Template(@1212312); columns.Template(x => x.Url + "asdasdasd"); but nothing works =( It just shows empty fields – Vladimirs May 13 '14 at 18:23
2

If you are binding with ajax, the format has to look something more like this:

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

See here for more info: http://www.telerik.com/forums/kendo-mvc-grid-actionlink-column

Josh
  • 1,876
  • 3
  • 21
  • 35
1
columns.Template(@Html.ActionLink("Edit", "Edit", new {id = @item.id }));

Check ScottGu's blog posts with regard to Razor for what @item is.

Atanas Korchev
  • 30,562
  • 8
  • 59
  • 93
  • need vb.net version of this code @(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); }) ) – moss Sep 09 '14 at 11:39
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);

This will generate something like action Link the id id = m.UserId you can show like DataKeys:

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

                        })

at the post method you will have :

public ActionResult xxx(int userId)
{
}
kleopatra
  • 51,061
  • 28
  • 99
  • 211
Nic
  • 1,088
  • 3
  • 19
  • 43
0

I had a print button I needed to put in the Header row, that I chose to put in the same column as, but above where the Update button goes. I was able to do it just fine in Razor like this:

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

This is where "Print Grid" was for display on my linkbutton, "OutputAgencies" was a method in my controller, and "AdminController" was the name of my controller.

vapcguy
  • 7,097
  • 1
  • 56
  • 52