RSS feed
Ligação do Modelo de Dados com Web Forms - Parte 2: Filtrando Dados (Série de posts sobre a ASP.NET vNext) - ScottGu's Blog em Português

Ligação do Modelo de Dados com Web Forms - Parte 2: Filtrando Dados (Série de posts sobre a ASP.NET vNext)


Este é o quarto post de uma série de posts que estou escrevendo sobre a próxima versão da ASP.NET ( ASP.NET vNext ).

Os próximos lançamentos do .NET e Visual Studio incluem vários novos e ótimos recursos e capacidades. Com a ASP.NET vNext você vai ver um monte de melhorias realmente emocionantes em formulários da Web ( Web Forms ) e MVC - assim como no núcleo da base de código da ASP.NET, no qual estas tecnologias são baseadas.

O post de hoje é o segundo de três posts que falam sobre o novo suporte para Model Binding ( Ligação do Modelo Dados ) que está chegando para Web Forms. Model Binding é uma extensão do sistema de data-binding ( ligação de dados ) existente na ASP.NET Web Forms e fornece um paradigma de acesso a dados focado no código. Este novo suporte tira proveito de um monte de conceitos relativos à ligação do modelo que introduzimos pela primeira vez com a ASP.NET MVC - e os integra muito bem com o modelo de controles do servidor para Web Forms.

No meu primeiro post sobre Model Binding eu falei sobre os conceitos básicos para fazer a seleção de dados. No post de hoje, vamos ver como podemos filtrar os dados selecionados com base na entrada do usuário, mantendo uma abordagem focada no código para fazer o acesso aos dados. Mostrarei como fazer essa filtragem usando a entrada de dados através da querystring, bem como usando um valor do formulário proveniente de um controle dropdownlist do servidor.

Começando

Vamos começar adicionando um controle <asp:GridView> em uma página e vamos configurá-lo para usar Model Binding para mostrar alguns dados da tabela Produtos do banco de dados Northwind. Nosso controle GridView a seguir tem uma propriedade SelectMethod que aponta para o método GetProducts() - o que fará com que ela chame o método GetProducts() que está presente dentro do nosso arquivo de code-behind, que por sua vez está usando a abordagem Code First do Entity Framework para simplesmente retornar Produtos que serão vinculados/ligados ao GridView.

<asp:GridView ID="productsGrid" SelectMethod="GetProducts" DataKeyNames="ProductID"

    AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" runat="server">

    <Columns>

        <asp:BoundField DataField="ProductID" HeaderText="ID" />

        <asp:BoundField DataField="ProductName" HeaderText="Name" SortExpression="ProductName" />

        <asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" SortExpression="UnitPrice" />

        <asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock" SortExpression="UnitsInStock" />

    </Columns>

</asp:GridView>

A seguir está o código do nosso arquivo code-behind (o qual contém o método GetProducts()):

public partial class Products : Page

{

    Northwind db = new Northwind();

    public IQueryable<Product> GetProducts()

    {

        return db.Products;

    }

}

Ao executarmos esta página ela produz o resultado esperado em uma tabela que contém os dados dos produtos:

imagem

Devido a estarmos retornando IQueryable<Product> do nosso método GetProducts(), os recursos de Ordenação e Paginação são automaticamente ativados (e são executados inteiramente no banco de dados de maneira eficiente e somente as 10 primeiras linhas que precisamos são retornadas para a camada intermediária [middle-tier]).

Filtrando usando um parâmetro da Querystring

Vamos agora adicionar um suporte básico para filtragem de dados em nossa aplicação. Especificamente, vamos permitir que os usuários opcionalmente possam filtrar os resultados de produtos de maneira que somente produtos que incluam uma palavra-chave em seus nomes serão retornados. Vamos especificar a palavra-chave usando um parâmetro da querystring. Por exemplo, a seguir nós indicamos que queremos apenas mostrar os produtos que possuem a palavra "chef" em seus nomes: 

imagem

Se nenhuma palavra-chave for especificada, então nós vamos querer mostrar todos os produtos como antes.

Atualizando nosso Método GetProducts()

Para ativar a filtragem dos dados, vamos atualizar nosso método GetProducts() para que ele receba um parâmetro chamado keyword (palavra-chave) igual ao mostrado a seguir:

public IQueryable<Product> GetProducts([QueryString]string keyword)

{

    IQueryable<Product> query = db.Products;

    if (!String.IsNullOrWhiteSpace(keyword))

    {

        query = query.Where(p => p.ProductName.Contains(keyword));

    }

    return query;

}

Se o parâmetro keyword for vazio ou nulo, então o método retornará todos os produtos presentes no banco de dados. Se uma palavra-chave for especificada, então filtraremos os resultados da consulta para que sejam incluídos somente aqueles produtos cujos nomes contêm a palavra-chave.

Entendendo os Provedores de Valor (Value Providers)

Uma das coisas que você deve ter notado no código acima é o atributo [QueryString] que aplicamos no parâmetro keyword no método GetProducts(). Esse atributo instrui o sistema de Model Binding a tentar "vincular/ligar" um valor da querystring ao parâmetro keyword no tempo de execução, fazendo qualquer conversão de tipo de dado necessária.

Estas fontes de valores do usuário são chamadas de "Value Providers", e os atributos dos parâmetros usados para instruir o sistema de Model Binding a usar um determinado Value Provider, são chamados de Value Provider Attributes (Atributos dos Provedores de Valor). A próxima versão da tecnologia Web Forms será lançada com provedores de valor e seus atributos correspondentes para todas as fontes comuns de entrada de dados do usuário em uma aplicação Web Forms, por exemplo, querystring, cookies, valores do formulário, controles, viewstate, sessão e perfil. Você também pode escrever seus próprios provedores de valor personalizados. Os provedores de valor que você escrever podem ser criados para funcionar tanto em formulários Web bem como MVC.

Por padrão, o nome do parâmetro será usado como a chave na coleção do provedor de valores, portanto, neste caso, um valor será procurado na querystring com a chave "keyword", por exemplo, ~ /Products.aspx?keyword=chef. Isso pode ser facilmente substituído, passando a chave desejada como um argumento para o atributo do parâmetro. Em nosso exemplo, podemos querer que o usuário seja capaz de usar a chave usual "q" da querystring para especificar o parâmetro keyword:

public IQueryable<Product> GetProducts([QueryString("q")]string keyword)

E agora podemos filtrar os resultados mostrados passando uma palavra-chave através da querystring:

imagem

Se você pensar sobre como você faria isso usando o código disponível hoje, provavelmente envolveria uma boa quantidade de linhas de código, por exemplo, para ler o valor, verificar se não é nulo, tentar convertê-lo para o tipo desejado, verificar se a conversão foi bem-sucedida, e então, finalmente usar o valor em sua consulta. Integrar o suporte à paginação e ordenação com isso (sem falar no suporte à edição dos dados) tornaria seu código ainda mais complexo. O sistema de Model Binding se destina a reduzir a necessidade de escrever este tipo de código, e quando você realmente tiver que escrever código, o sistema te permitirá reutilizá-lo de maneira limpa em toda sua aplicação.

Filtrando Dados usando Controles

Vamos agora mudar nosso exemplo de forma que o usuário possa escolher uma categoria para filtrar os produtos usando uma lista drop-down.

imagem

Para fazer isso, vamos adicionar uma lista drop-down no código HTML da nossa página e vamos configurá-la para obter seus dados a partir de um método chamado GetCategories() que está dentro do nosso arquivo de code-behind. Faremos isso através de sua propriedade SelectMethod:

<asp:DropDownList ID="category" SelectMethod="GetCategories"

     AppendDataBoundItems="true" AutoPostBack="true"

     DataTextField="CategoryName" DataValueField="CategoryID"

     runat="server">

    <asp:ListItem Value="" Text="(All)" />

</asp:DropDownList> 

<asp:GridView ID="productsGrid" SelectMethod="GetProducts" DataKeyNames="ProductID"

              AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" runat="server">

    <Columns>

        <asp:BoundField DataField="ProductID" HeaderText="ID" />

        <asp:BoundField DataField="ProductName" HeaderText="Name" SortExpression="ProductName" />

        <asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" SortExpression="UnitPrice" />

        <asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock" SortExpression="UnitsInStock" />

    </Columns>

</asp:GridView>

Vamos então atualizar nosso arquivo code-behind para incluir um novo método GetCategories() (para preencher o controle DropDownList), e um método GetProducts() atualizado que filtrará os dados com base na categoria selecionada na DropDownList:

public partial class Products : Page

{

    Northwind db = new Northwind();

    //

    // Select method for DropDownList

    public IEnumerable<Category> GetCategories()

    {

       return db.Categories.ToList();

    }

    //

    // Select method for GridView

    public IQueryable<Product> GetProducts([Control] int? category)

    {

       IQueryable<Product> query = db.Products;

       if (categoryId.HasValue)

       {

          query = query.Where(p => p.CategoryID == category);

       }

       return query;

   }

}

Observe acima como nós mudamos o método GetProducts() para que ele receba uma categoria anulável como parâmetro. Estou em seguida, usando o atributo [Control] no parâmetro category para vinculá-la ao valor do controle DropDownList "category". Dentro do método GetProducts(), estou checando para ver se o valor padrão All (Todos) foi selecionado - e só realizo a filtragem dos dados por categoria se um valor diferente de Todos for escolhido a partir da DropDownList.

O sistema de Model Binding irá monitorar os valores dos parâmetros para os métodos de seleção para detectar se eles mudaram durante os post-backs, e em caso afirmativo, fará com que o controle de dados associado automaticamente seja preenchido novamente para refletir a mudança. Isto torna mais fácil criar páginas que fazem a vinculação dos dados somente quando necessário, sem que você tenha que escrever um monte de código ou que você esteja intimamente consciente do ciclo de vida da página do formulário web.

E agora, quando executamos nossa página novamente, podemos selecionar a opção padrão (All) na DropDownList para mostrar todos os produtos, ou em vez disso, podemos filtrar os produtos usando uma categoria selecionada:

imagem

Ordenação e paginação são mais uma vez ativadas automaticamente (e feitas no banco de dados - o que é eficiente), independentemente de termos filtrado os dados ou não.

Vídeo rápido sobre Model Binding e Filtragem de Dados

Damian Edwards tem um ótimo video de 90 segundos que mostra o uso do sistema de model binding para implementar um cenário de GridView com filtragem de dados. Você pode assistir o vídeo de 90 segundos aqui.

Sumário

O novo suporte a Model Binding na ASP.NET vNext é uma boa evolução do sistema atual de ligação de dados em Web Forms. Este suporte torna simples filtrar os dados com base na entrada do usuário usando um paradigma de acesso a dados focado no código. Você pode usar os Atributos dos Provedores de Valor para instruir de onde o sistema de Model Binding deve pegar os valores dos filtros, e você pode até mesmo escrever seus próprios Provedores de Valor para cenários mais complexos.

No próximo post, veremos como podemos habilitar cenários de edição de dados usando Model Binding.

Espero que ajude,

Scott

P.S. Além do blog, eu uso o Twitter para disponibilizar posts rápidos e para compartilhar links. Meu apelido no Twitter é: @scottgu


Texto traduzido do post original por Leniel Macaferi.

Published Monday, September 12, 2011 4:18 PM by Leniel Macaferi
Filed under: , ,

Comments

# S&#233;rie de posts sobre a pr&#243;xima vers&#227;o da ASP.NET ( vNext ) - ScottGu's Blog em Portugu??s

Pingback from  S&#233;rie de posts sobre a pr&#243;xima vers&#227;o da ASP.NET ( vNext ) - ScottGu's Blog em Portugu??s

# Ligação do Modelo de Dados com Web Forms - Parte 3: Atualização e Validação dos Dados (Série de posts sobre a ASP.NET 4.5)

Tuesday, November 01, 2011 11:24 AM by ScottGu's Blog em Português

Este é o quinto post de uma série de posts que estou escrevendo sobre a ASP.NET 4.5. Os próximos lançamentos

Leave a Comment

(required) 
(required) 
(optional)
(required)