c# - example - Formato ASP.NET MVC3 WebGrid: parámetro
webgrid mvc 5 bootstrap (3)
Estoy tratando de usar el nuevo WebGrid en ASP.NET MVC3 y una de las columnas que quiero mostrar conjunto de iconos de enlace que realiza varias acciones (Editar, Ver, Eliminar) ... Para este propósito tengo una extensión HtmlHelper que básicamente salidas siguientes HTML:
<a href="" title=""><img alt="" src="" /></a>
La extensión devuelve MvcHtmlString y funciona bien cuando se usa en las vistas de Razor por sí misma ... Ec: @ Html.ActionLinkIconForEditAction ("Cliente", 2)
El problema es que necesito invocar este helper (una vez para cada acción) en la columna WebGrid mientras paso el ID del objeto. El problema con el que estoy perplejo es que el compilador me da un error al decir que no puede convertir MvcHtmlString (o ''lambda expression'' dependiendo de la invocación que intento) a System.Func esperado por el formato ...
Entonces, por ejemplo, esto funciona:
grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", 2)</text>)
Pero esto no:
grid.Column(header: "", format: (customer) => @<text>@Html.ActionLinkIconForEditAction("Customer", customer.Id)</text>)
grid.Column(header: "", format: (customer) => Html.ActionLinkIconForEditAction("Customer", customer.Id))
Yo obtengo:
Error 4 Argument 3: cannot convert from ''lambda expression'' to ''System.Func<dynamic,object>''
o para esta llamada:
grid.Column(header: "", format: Html.ActionLinkIconForEditAction("Customer", customer.Id)),
Yo obtengo:
Error 5 Argument 3: cannot convert from ''System.Web.Mvc.MvcHtmlString'' to ''System.Func<dynamic,object>''
Lo que es raro, tengo otras columnas que usualmente utilizan lambdas, acceso directo a Model.Property e incluso salidas de String.Format ("") ... Todas funcionan bien ... Leo todos los documentos de Func y este hilo también , y todavía no puedo entenderlo :)
¿Alguien puede detectar lo que estoy haciendo mal?
Lo tengo :) .... El problema parece estar en la forma en que C # maneja los objetos dinámicos ... Muchos usuarios se divierten con esto ...
La solución fue tan simple como enviar un tipo correcto del parámetro a mi asistente de extensión ... Así que esto funciona:
grid.Column(header: "", format: @<text>@Html.ActionLinkIconForEditAction("Customer", (int)item.Id)
El otro truco es usar "construido" en el objeto "item" y no proporcionar el suyo ... Así que, por ejemplo, esto no funciona:
grid.Column(header: "", format: (customer) => @<text>@Html.ActionLinkIconForEditAction("Customer", (int)customer.Id)
Mucha lectura, ajustes, aprendizaje ... Afortunadamente, la próxima versión tendrá algo mucho más fácil de usar cuando necesite agregar contenido a columnas que no provienen directamente del modelo ...
Saludos Z ...
Tuve que crear un WebGrid
en código C # y tuve que mostrar una columna específica usando hipervínculo. Ninguna de las técnicas mencionadas anteriormente funcionó para mí. Entonces, utilicé MvcHtmlString.create
y pasé el valor String.format
de String.format
.
format: (item) => MvcHtmlString.Create(string.Format((A HREF=/"/Inventory/EditInventory/{0}/"){1}(/A)", item.ID, item.Property)))
Reemplace el (o) dentro de la cadena con <o> respectivamente.
grid.Column(format: (item) => Html.ActionLink("EditCustomer","Editcustomer", new {CustomerId=item.CustomerId}))
Esto funcionará, y encima de uno también funciona ... Aquí primero "EditCustomer" es el texto para ser visible para los usuarios, segundo "EditCustomer" es el nombre de la acción que quieres que redirija, y el elemento es