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:

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:

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:

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.

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:

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.