ASP
.NET - Filtrando com WebGrid e SQL Server Compact Edition 4.0.
Eu já apresentei o Helper WebGrid e a sintaxe Razor em outros artigos e a seguir você tem os links destes artigos, e, eu sugiro que você leia os artigos antes de continuar se você não tem noções de Razor, HTML Helpers e ASP .NET MVC.
Neste artigo eu vou mostrar como podemos usar o WebGrid para exibição de resultados usando filtros com o banco de dados SQL Server Compact Edition 4.0.
No exemplo deste artigo eu vou usar o banco de dados Northwind.sdf que é instalado por padrão quando da instalação do Visual Studio e o Visual Studio Express 2012 for Web que uma versão gratuita para desenvolver problemas usando ASP .NET.
Abra então o o Visual Studio Express 2012 for Web e clique no menu New Web Site;
Selecione o template Visual C# -> ASP .NET Web Site(Razor v1) e informe o nome FiltroWebGrid e clique no botão OK;
![]() |
Será criado um novo web site com a seguinte estrutura:
![]() |
Vamos ajustar o web site excluindo a pasta Account alguns arquivos e criar a pasta scripts de forma ter a seguinte estrutura:
![]() |
Na pasta App_Data vamos incluir o arquivo Northwind.sdf e vamos definir o código das demais páginas.
Na pasta styles vamos definir o arquivo site.css com o seguinte conteúdo:
body, input, textarea, select {
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
font-size: 12px;
color: #669;
line-height: 1.6em;
}
a{
color: #6078BF;
}
.table
{
background: #fff;
border-collapse: collapse;
text-align: left;
}
.table th
{
font-size: 14px;
font-weight: normal;
color: #039;
padding: 10px 8px;
border-bottom: 2px solid #6678b1;
}
.table td
{
border-bottom: 1px solid #ccc;
padding: 6px 8px;
}
.alternate{
background: #e6f4ff;
}
.selected{
background: #ffff99;
}
.highlight{
background: #ffff99;
}
.clickable{
cursor: pointer;
background: #ffff99;
}
#grid{
margin: 45px;
}
|
Agora vejamos o código do arquivo de leiaute:
1- Pagina _layout.cshtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@Page.Title</title>
<script src="@Href("~/scripts/jquery-1.6.2.min.js")" type="text/javascript"></script>
<link href="@Href("~/styles/site.css")" rel="stylesheet" />
@RenderSection("script", required: false)
</head>
<body>
@RenderBody()
</body>
</html>
|
Nesta página definimos o leiaute do site definindo a referência ao arquivo jquery e ao arquivo de estilo site.css na pasta styles.
Temos também a definição de uma RenderSection chamada script que iremos criar na página Default.cshtml.
Você pode identificar múltiplas seções de conteúdo dentro de uma página de layout; isto é útil se você deseja criar layouts que têm mais de uma área de conteúdo substituível. Esta técnica envolve identificar seções dentro de sua página de layout usando o método RenderSection() para fornecer seções de conteúdo com um nome correspondente em suas páginas de conteúdo.
Cada seção identificada dentro da página de conteúdo está contida dentro de um bloco @section.
Para saber mais sobre RenderSection leia o meu artigo: ASP .NET - Sintaxe Razor e Layout com WebMatrix - II
2- Pagina _PageStart.cshtml
@{
Layout = "~/_layout.cshtml";
}
|
Esta página faz a chamada a página _layout.cshtml
3- Página Default.chstml
@{
Page.Title = "Filtrando com WebGrid";
var db = Database.Open("Northwind");
var consulta = "SELECT DISTINCT Country FROM Customers ORDER BY Country";
var paises = db.Query(consulta);
consulta = "SELECT * FROM Customers WHERE CompanyName LIKE @0 AND Country LIKE @1";
var empresa = "%" + Request["company"] + "%";
var pais = "%" + Request["country"] + "%";
var dados = db.Query(consulta, empresa, pais);
var columns = new[]{"Cliente", "CompanyName", "ContactName", "Address", "City", "Country", "Phone"};
var grid = new WebGrid(dados, columnNames: columns, rowsPerPage: 6);
}
<h1>Filtrando com WebGrid</h1>
<form method="post">
<div id="grid">
Nome da Empresa: <input type="text" name="company" value="@Request["company"]" />
Nome do País: <select name="country">
<option></option>
@foreach(var item in paises){
<option @(Request["country"] == item.Country ? " selected=\"selected\"" : "")>@item.Country</option>
}
</select>
<input type="submit" />
@grid.GetHtml(
tableStyle : "table",
alternatingRowStyle : "alternate",
headerStyle : "header",
columns: grid.Columns(
grid.Column("CustomerID", "ID"),
grid.Column("CompanyName", "Empresa"),
grid.Column("ContactName", "Contato"),
grid.Column("Address","Endereço"),
grid.Column("City", "Cidade"),
grid.Column("Country", "Pais"),
grid.Column("Phone", "Telefone")
)
)
</div>
</form>
@section script{
<script type="text/javascript">
$(function(){
$('th a, tfoot a').live('click', function() {
$('form').attr('action', $(this).attr('href')).submit();
return false;
});
});
</script>
}
|
Por padrão, o grid é preenchido por todas as empresas cadastradas no banco de dados. Há um par de parâmetros na cláusula WHERE, mas o valor dos parâmetros na primeira requisição é %% o que equivale a um curinga.
A caixa de texto permite que o usuário procure por entradas com base em parte de um nome de empresa, enquanto a lista de seleção permite que o usuário filtre os resultados por país na grid.
O formulário é enviado para o servidor, e é aí que reside a raiz do problema. Você pode ver que os links para classificação e paginação que vinculam os recursos são parte do grid que quando forem clicados resultam em solicitações GET que estão sendo feitas.
A resposta para o problema está no trecho do jQuery que aparece na seção script. Um manipulador está anexado ao evento onclick dos links no topo e rodapé da tabela - os links classificação e paginação.
Quando eles forem clicados, o valor do link é obtido e fornecido para o atributo action do formulário; então o formulário é submetido usando POST, e o pedido GET é cancelado fazendo return igual a false.
Isso garante que as informações de paginação e classificação sejam preservados na coleção Request.QueryString, enquanto os valores de campo de formulário são passados na coleção Request.Form.
Abaixo vemos o resultado da execução do web site (F5) usando os recursos de classificação, paginação e filtragem:
![]() |
Um recurso poderoso e simples de implementar.
Pegue o projeto completo
aqui:
FiltroWebGrid.zip
Disse Jesus :
Enquanto estou no mundo, sou a luz do mundo. ( Joã 9:5 )Referências: