ASP.NET MVC + Flexigrid ( Parte 2 ) – Habilitando e configurando a ordenação com Dynamic Linq

Standard

Dando continuidade na série sobre ASP.NET MVC + Flexigrid, irei demonstrar nesta segunda parte como podemos habilitar e configurar a ordenação pelas colunas em nosso grid. Caso você ainda não tenha visto o artigo anterior onde falei, como criar e renderizar o grid, clique aqui. Isto é muito importante, pois durante todos as partes e novas implementações da série, estarei utilizando o projeto de exemplo da primeira parte.


Analisando como a ordenação funciona

Bom, até o momento como podemos observar, ao clicar em alguma coluna do grid nada acontece, certo? Errado! Se analizarmos mais afundo, podemos perceber que, quando ocorre algum evento de clique em qualquer coluna do grid, é disparado um ajax que chama nosso método de renderização CarregaFlexgrid, enviando todos os parâmetros que o grid possui! Isso acontece devido ao fato de todas nossas colunas estarem configuradas com a propriedade sortable igual a true, veja:

Imagem 1

Outra informação importante é, se observarmos um pouco mais abaixo, veja que é definida as propriedades sortname igual a “nome” e sortorder igual a “asc”, note:

Imagem 2

Estas propriedades definem como será efetuada a ordenação inicial do grid, ou seja, quando o mesmo é carregado pela primeira vez, ou quando a página é recarregada.

NOTA: Atente-se que, a propriedade sortname geralmente é definida com o mesmo nome de alguma coluna da tabela referente, em seu contexto de dados. Já a propriedade sortorder pode receber apenas os valores “asc” para ascendente e “desc” para descendente.

Porém, estas configurações não estão sendo efetivamente realizadas ao carregar o grid. Isto pois, a ordenação de nossa página no método de renderização está definida manualmente, veja abaixo:

 

int indicePaginaAtual = Convert.ToInt32(Request.Params["page"]);
int itensPorPagina = Convert.ToInt32(Request.Params["rp"]);
string campoOrdenacao = Request.Params["sortname"];
string tipoOrdenacao = Request.Params["sortorder"];

//IQueryable de Clientes
var listaClientes = from c in _db.Cliente select c;

//Realiza a ordenação e paginação
var listaPaginada = listaClientes.OrderBy(c => c.nome)
                                 .Skip((indicePaginaAtual - 1) * itensPorPagina)
                                 .Take(itensPorPagina);

Como podemos ver, apenas os parâmetros indicePaginaAtual e itensPorPagina estão sendo utilizando, justamente para realizar a páginação. Porém, o OrderBy está manualmente configurado para a propriedade nome, desta forma, sempre que for realizada uma chamada, apenas será ordenado ascendentemente por nome!
Na realidade devemos utilizar os parâmetros campoOrdenacao e tipoOrdenacao. Let’s go.

Configurando a ordenação

Irei utilizar para nos auxiliar nesta etapa da ordenação, um recurso muito útil chamado Dynamic Linq. Não irei entrar em detalhes de como o mesmo funciona, até por que no link passado, Scott Guthrie exibe e explica diversos exemplos de como o mesmo funciona e disponibiliza o link para download. 🙂

Criei uma classe chamada DynamicLinq.cs dentro do diretório Helpers, e inseri o código do DynamicLinq, Atente-se em manter o namespace do mesmo como System.Linq.Dynamic:

Imagem 3

Em seguida, basta importarmos o namespace System.Linq.Dynamic, e efetuar as seguintes alterações na query de renderização:

//Realiza a ordenação e paginação
var listaPaginada = listaClientes.OrderBy(campoOrdenacao + " " + tipoOrdenacao)
                                    .Skip((indicePaginaAtual - 1) * itensPorPagina)
                                    .Take(itensPorPagina);

Pronto, observe que agora a ordenação está dinâmica, ou seja, independente do campo a ser ordenado ou tipo de ordenação, a mesma será executada levando em conta os parâmentros enviados pelo grid.

Legal não?

 

 

One thought on “ASP.NET MVC + Flexigrid ( Parte 2 ) – Habilitando e configurando a ordenação com Dynamic Linq

Leave a Reply

Your email address will not be published. Required fields are marked *