web-dev-qa-db-fra.com

Utilisation de données dans un HTML.ActionLink dans un WebGrid.column, impossible?

J'ai le WebGrid suivant dans mon application de test ASP.NET MVC3. Il affiche une liste de clients:

@grid.GetHtml(
tableStyle: "grid",
headerStyle: "head",
alternatingRowStyle: "alt",
columns: grid.Columns
         (
         grid.Column(format: (item) => Html.ActionLink("Edit", "Details", new { id = item.id })),
         grid.Column("Address.CompanyName"),
         grid.Column("Address.City")
         )
)

La partie intéressante ici est le lien Edit que j'ai ajouté dans la première colonne. Je voudrais utiliser le numéro de compte du client au lieu du simple test "Edit". Cependant, cela me pose beaucoup de problèmes.

J'ai essayé:

grid.Column(format: (item) => Html.ActionLink(item.AccountNumber.ToString(), "Details", new { id = item.id })),

Cependant, il semble y avoir quelque chose que je ne comprends pas sur la façon dont cela fonctionne car je continue à recevoir cette exception:

CS1502: The best overloaded method match for 'System.Web.Helpers.WebGrid.Column(string, string, System.Func<dynamic,object>, string, bool)' has some invalid arguments

Quelqu'un peut-il m'expliquer pourquoi cela ne fonctionne pas? Quelle est la différence entre "Edit" et item.AccountNumber.ToString() (à part l'orthographe)?

Je dois noter que le lien fonctionne avec le texte "Edit", et que AccountNumber est long.

18
Thomas

Voici un exemple de comment je le fais avec une date. 

grid.Column(columnName: "Date", format: (item) => Html.ActionLink(((string)item.Date), "Edit", new { id = item.id })),          

Vous devez vous méfier de l'utilisation de l'extension méthodes (HTML *.) avec dynamique (article) ... ça ne marche pas bien dans csharp. Quand vous faites le nouveau {} projection ou appelez ToString, c’est non. dynamique plus longue. Sinon, vous pourrait lancer: (objet) item.Id.

De ici .

28
Derek Beattie

Juste au cas où quelqu'un se demanderait comment cela devrait apparaître dans VB, voici un exemple:

grid.Column("PersonID", "Admin", Function(modelItem) Html.ActionLink("View", "Details", New With {.id = modelItem.PersonID}))
5
MVCNoobSQLGuru

Dans mon cas, la solution de Derek Beattie ne fonctionne pas.

Et j'utilise ceci

 grid.Column(format: (item) => Html.ActionLink("Edit", "Edit", new { id = item.ID }), style: "column-action") 
2
Academy of Programmer

Mes colonnes étaient générées dans le modèle, où Html.ActionLink semble inaccessible. J'ai donc dû créer le href et le renvoyer en tant que MvcHtmlString. C'est ce que j'ai fini par faire, 

new WebGridColumn{ColumnName="FileName", Header= "File",
                Format = item => new MvcHtmlString("<a href='" + item.FileLink + "'>" + item.FileName +"</a>")
1
lanternmarsh

J'utilise le code suivant pour la grille. Cela fonctionne pour moi.

@grid.GetHtml(
    columns: grid.Columns(
        grid.Column(header: "Serial No", format:@<text><div>@(item.WebGrid.Rows.IndexOf(item) + 1)</div></text>),
        grid.Column(columnName: "Stdname", header: "Student Name"),
        grid.Column(header: "Email ID", format:@<text><a href="mailto:@item.Email">@item.Email</a></text>),
        grid.Column(header: "EDIT",format: (item) => Html.ActionLink("Edit", "Edit", new { id = item.ID })),
        grid.Column(header: "DETAILS", format: (item) => Html.ActionLink("Details", "Details", new { id = item.ID })),
        grid.Column(header: "DELETE", format: (item) => Html.ActionLink("Delete", "Delete", new { id = item.ID }))
))

J'espère que c'est utile.

0
Andy Rocks
 @Html.Grid(Model).Columns(columns => {
    columns.Add(c => c.ConsumerNo).Titled("Consumer No").SetWidth(70).Filterable(true);
    columns.Add(c => c.ConsumerName).Titled("Consumer Name").SetWidth(200).Filterable(true);
    columns.Add(c => c.MobileNo).Titled("Mobile No").SetWidth(70).Filterable(true);
    columns.Add(c => c.Address).Titled("Address").SetWidth(200).Filterable(true);
    columns.Add(c => c.AreaName).Titled("Area Name").SetWidth(70).Filterable(true);
    columns.Add(c => c.StaffName).Titled("Staff Name").SetWidth(100).Filterable(true);
    columns.Add().Encoded(false).Sanitized(false).Titled("INSPECT").SetWidth(60).RenderValueAs(o => Html.ActionLink("INSPECT", "InspForm", new { id = o.UniqueConsumerId, style = "background-image:url('~/Images/orderedList1.png')" }));                       
}).WithPaging(10).Sortable(true)
0
Pushpraje96

J'ai résolu comme ça

grid.Column("Id", format: (item) => Html.ActionLink((string)item.id.ToString(), "Edit", new { id = item.id }))

0
Virat Sarswat