Como fazer com que a coluna personalizada da grade de contribuição MVC funcione com aspx
-
13-12-2019 - |
Pergunta
Estou usando o MVC Contrib Grid para renderizar, classificar e filtrar minha grade de dados, mas estou tendo problemas agora que ela foi atualizada para MVC3 e Razor.O método Custom em minha coleção de colunas não funciona para páginas aspx e o método Action das colunas agora está obsoleto.
Eu uso o método de ação grids para renderizar minhas colunas assim no MVC 2:
...
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
column.For("View User").Named("Tools").Action(x => { %>
<td>
<%= Html.ActionLink("View", "View", new { id = p.Id })%>
<%= Html.ActionLink("Edit ", "Edit", new { id = p.Id })%>
//Snip as there are too many tools :-)
//.....
<%= Html.ActionLink("Delete", "Delete", new { id = p.Id })%>
</td>
<% });
...
Agora, com a versão mais recente, existe um método Custom que substitui o método Action obsoleto.Eu olhei como isso pode ser feito aqui, que basicamente funciona para mim agora, mas perdi todos os meus ajudantes na visualização aspx (url, etc) e agora preciso renderizar meu conteúdo em outro método em meu modelo, como abaixo:
...
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
//the new custom column
column.Custom(Model.ToolsRenderer);
<% });
...
O método de modelo de grade abaixo, chamado ToolsRenderer, é usado para renderizar minha string HTML.
public UserManagementViewModel : BaseModel {
//..snip
//
public object ToolsRenderer(Client client)
{
List<string> links = new List<string>();
var editLink = new TagBuilder("a");
// here is my biggest problem, before Html.ActionLink used to make
// sure that I don't have any missing links or help me if i need to
// refactor an action / controller name :-(
editLink.Attributes["href"] = GetEditUserLink(client, HttpContext.Current.Request.Url.AbsoluteUri);
editLink.SetInnerText("edit");
links.Add(editLink.ToString());
...
...lots of links to be generated here
...
return MvcHtmlString.Create(string.join(" |", links))
}
//..snip
}
Isso funciona por enquanto, mas existe uma maneira de fazer minha página aspx funcionar como as visualizações do razor, como abaixo?
@Html.Grid(Model).Columns(column =>
{
column.For(x => x.Id).
column.For(x => x.Name);
column.Custom(@<td><a href='@Html.Actionlink("edit","user",new {id})' alt="@item.email"/><a></td>)
})
Quero dizer algo como:
...
column.Custom(%><td><a href='<%=Html.Actionlink("edit","user",new {id})%>' alt="<%=item.email%>"/><a></td><%)
...
Solução
Finalmente consegui encontrar uma solução alternativa com alguma ajuda e pesquisa e, em vez de usar a coluna personalizada, use column.for e insira Html.Partial.Algo como o código abaixo.
<% Html.Grid(Model).Columns(column => {
column.For(x => x.Id);
column.For(x => x.Name);
column.For(x => x.Email);
column.For(x => x.DateOfBirth);
// could use RenderPartial() to
column.For(x =>Html.Partial("UserActionColumn", x));
<% });
Outras dicas
Para o caso Razor, @helper pode ser usado para campos personalizados.
Por exemplo:
column.For(r => Status(r.Status)).Encode(false).Named("Status");
@helper Status(string value)
{
if (value == RequestStatus.Pending)
{
<span class="label label-info">@value</span>
}
...
}
Complementando as outras respostas, se você quiser classificar por essa coluna personalizada, não esqueça de adicionar um SortColumnName
.Se você não fizer isso, a grade usará o Named
argumento como o nome da coluna, mas Named
também é usado para dar um título à coluna.Só estou com dor de cabeça porque o nome da minha coluna não corresponde ao título:
column.For(c => "custom text").Named("Column Name").SortColumnName("ColumnName");