![]() |
||||||||
|
|
||||||||


| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

|
|
Pesquisa personalizada
Construindo uma Cesta de Compras com o ASP.NET MVC O objetivo deste artigo é fazer a construção de uma cesta de compras, passo-a-passo, utilizando o ASP.NET MVC. Como o passo-a-passo em si já será longo, não irei neste artigo fazer uma análise mais detalhada dos passos, apenas executa-los. No artigo Analisando uma aplicação ASP.NET MVC você encontra uma análise bem mais detalhada do resultado da construção, o que tem de bom e o que tem de ruim. Este artigo está sendo construido para fins de análise da tecnologia, não recomendo que o sigam sem analisar todos os pontos levantados no conjunto de 3 artigos que estou publicando sobre este tópico. No primeiro artigo, encontrarão informações mais conceituais sobre o ASP.NET MVC Requisitos
Passo-a-Passo 1) Crie um projeto ASP.NET MVC Web Application
2) Na pasta models, crie um dataset chamado dsNorth
3) Crie um tableAdapter e uma dataTable products, trazendo os campos productid, productname, unitprice e unitsinstock
4) Na pasta Controllers, clique com o botão direito e crie uma Controller Class chamada ProductsController
5) No productsController crie a sub listar com o seguinte código : Public Sub Listar() Dim ta As New dsNorthTableAdapters.ProductsTableAdapter() Dim dados As New dsNorth ta.Fill(dados.Products) RenderView("ListarProdutos", dados.Products)
End Sub
6) Dentro da pasta views, crie a pasta Products
7) Dentro da pasta Products crie uma nova view chamada ListarProdutos.aspx
8) Altere a herança no code-behind da view para que fique da seguinte forma : Public Partial Class ListarProdutos Inherits System.Web.Mvc.ViewPage(Of dsNorth.ProductsDataTable) End Class
9) Utilizando a instrução Table->Insert Table, insira uma tabela com duas linhas e 4 colunas
10) Através do menu view, abra a janela Apply Styles
11) Com o botão direito no estilo, selecione "Modify Style"
12) Altere o nome do estilo para ".Tabela" 13) Na opção Table, altere o borderspacing para 0 (em CSS será equivalente ao cellspacing) 14) Altere o Border-collapse para collapse 15) Utilizando a barra de seleção (parte inferior da tela) clique na tabela que ainda está com o style1 aplicado
16) Clique no estilo ".Tabela" que está na janela Apply Styles.
17) Com o botão direito no estilo ".Tabela" selecione "New Style Copy..."
18) No novo estilo, indique ".Tabela tr td" para especificarmos características de cada célula 19) Em box, defina a Margin e o Padding como 0
20) Em table defina borderspacing como 0 e border-collapse como collapse
21) Preencha as colunas da 1a linha respectivamente com ProductID, ProductName, UnitPrice e Comprar
22) Selecione a linha e faça as seguintes formatações :
23) Clique com o botão direito no Style1, utilize "Modify Style" e altere o nome do estilo para Titulo 24) Selecione a linha da tabela e clique no estilo Titulo da janela Apply Styles para fazer sua aplicação 25) Selecione a 2a linha e defina uma cor agradável no fundo 26) Altere o nome do estilo que é gerado (style1) para estiloLinha 27) Selecione novamente a mesma linha (que encontra-se novamente em branco) 28) Altere a cor de fundo para uma cor agradável e que contraste com a cor anterior 29) Altere o nome do style1 criado para estiloLinhaAlt
30) Altere a visualização para o modo source 31) Logo abaixo do fechamento do primeiro TR, abra um trecho de código ASP
32) Defina as variáveis i, estiloLinha e estiloLinhaAlt : Dim i As Integer, estiloLinha = "estilolinha", estiloLinhaAlt = "estilolinhaAlt" 33) Faça um laço (for each) para cada linha da tabela recebida pela View For Each d As siteCesta.dsNorth.ProductsRow In ViewData Next
34) Coloque a 2a linha da tabela em meio ao código ASP, intercalando ASP com HTML 1: <% 2: <tr> 3: <td> 4: </td> 5: <td> 6: </td> 7: <td> 8: </td> 9: <td> 10: </td> 11: </tr> 12: <%
35) Utilize a variável criada no for/each (d) para exibir os campos em seus devidos locais 1: <tr> 2: <td> 3: <%= d.ProductID %></td> 4: <td> 5: <%= d.ProductName %></td> 6: <td>7: <%= String.Format("{0:C}", d.UnitPrice) %></td> 8: <td> 9: </td> 10: </tr>
36) Adicione um novo tableAdapter no dsNorth, apontando para a tabela "Cesta" no northwind, trazendo os campos UserID, ProductId, Preco, Quant
37) Ao montar o select, inclua um filtro por UserId, pois a cesta nunca será exibida por completo, sempre filtrada por usuário 38) Desmarque a opção GenerateDbDirectMethods
39) Crie um método no tableAdapter "Cesta" chamado InserirProduto e que execute um simples insert na tabela cesta
40) Adicione a seguinte query no tableAdapter de "Cesta" com o nome de ExisteProdutoCesta : 1: SELECT 1 2: FROM Cesta 3: WHERE (UserId = @UserId) AND (ProductId = @ProductId)
41) Monte um método de update chamado AdicionarQuantidade com a seguinte instrução SQL : 1: UPDATE Cesta 2: SET Quant = Quant + @Quant 3: WHERE (UserId = UserId) AND (ProductId = ProductId)
42) No tableAdapter de Products, crie uma query scalar com o nome de ObterPrecoProduto e o seguinte SQL : 1: SELECT UnitPrice 2: FROM Products 3: WHERE (ProductID = @ProductID)
43) No ProductsController crie uma função Comprar com o seguinte código : Public Function Comprar(ByVal idProduto As Integer, ByVal idusuario As String) As Boolean Dim ta As New dsNorthTableAdapters.ProductsTableAdapter Dim ta2 As New dsNorthTableAdapters.CestaTableAdapter Dim qtd As Integer = Me.ReadFromRequest("txtquant") If ta2.ExisteprodutoCesta(idusuario, idProduto).HasValue Then ta2.AdicionarQuantidade(qtd, idusuario, idProduto) Else
Dim preco As Decimal preco = ta.ObterPrecoProduto(idProduto) ta2.InserirProduto(idusuario, idProduto, qtd, preco) End If RedirectToAction("Listar")
End Function
44) Voltando para a view, na última coluna da 2a linha (comprar), crie duas variáveis que serão utilizadas para fazer a chamada do método "comprar", conforme o código abaixo : 1: <% 2: Dim id As Integer 3: Dim usuario As String 4: 5: id = d.ProductID 6: usuario = Request.AnonymousID 7: %>
45) Estamos utilizando o AnonymousID para identificar o usuário, então precisaremos habilitar o anonymousID no web.config, além de mudar a autenticação para forms, da seguinte forma : 1: <anonymousIdentification enabled="true" /> 2: <authentication mode="Forms"/>
46) Crie um formulário HTML, logo depois da declaração das variáveis : 1: <% 2: Dim id As Integer 3: Dim usuario As String 4: 5: id = d.ProductID 6: usuario = Request.AnonymousID7: Using Html.Form(Of siteCesta.ProductsController)(New Action(Of siteCesta.ProductsController)(Function(x As siteCesta.ProductsController) x.Comprar(id, usuario))) 8: 9: End Using 10: %>
47) Criar uma textbox para a quantidade com o trecho de código abaixo : 1: <% Using Html.Form(Of siteCesta.ProductsController)(New Action(Of siteCesta.ProductsController)(Function(x As siteCesta.ProductsController) x.Comprar(id, usuario))) %> 2: <%= Html.TextBox("txtQuant", 20) %> 3: <% End Using %>
48) Crie um botão Submit, no qual o usuário irá clicar para efetivar a compra. 1: <% Using Html.Form(Of siteCesta.ProductsController)(New Action(Of siteCesta.ProductsController)(Function(x As siteCesta.ProductsController) x.Comprar(id, usuario))) %> 2: <%= Html.TextBox("txtQuant", 20) %> 3: <%= Html.SubmitButton("cmdComprar", "Comprar") %> 4: <% End Using %>
49) Nas propriedades do projeto, na aba "Web", em "Specific Page" indique "products/listar" para que ao rodar o projeto a ação de listar dos produtos seja imediatamente executada
50) Execute a aplicação para testa-la. Você poderá observar a lista de produtos. Indique uma quantidade e faça uma compra.
51) Usando o server explorer, abra a tabela e confira os produtos adquiridos.
52) Na pasta controllers crie uma nova controller class chamada CestaController
53) No CestaController crie o método listar com o seguinte código : Function Listar()
Dim ta As New dsNorthTableAdapters.CestaTableAdapter Dim dados As New dsNorth ta.Fill(dados.Cesta, Me.ControllerContext.HttpContext.Request.AnonymousID)
RenderView("Cesta", dados.Cesta)
End Function
54) Na pasta views, crie uma nova pasta chamada Cesta 55) Na pasta cesta, insira uma nova view chamada cesta.aspx
56) Na pasta Content, crie um novo arquivo css cha mado cesta.css 57) Abra a view ListarProdutos.aspx 58) Arraste o arquivo Cesta.css da pasta Content para dentro da página ListarProdutos.aspx
58) Abra a janela Manage Styles (menu view)
59) Arraste todos os estilos de "Current Page" para o Cesta.css
60) Na view Cesta, crie uma tabela com 2 linhas e 4 colunas 61) Insira os seguintes títulos na 1a linha : Produto, Preço, Quantidade e Total
62) Pelo solution explorer, arraste o arquivo cesta.css para dentro da view cesta.aspx 63) Exiba a janela apply styles 64) Selecione e linha de título e aplique o estilo da linha de título 65) Na lista de objetos, selecione a tabela e clique no estilo "Tabela"
66) No code-behind, altere a herança para : Public Partial Class Cesta Inherits System.Web.Mvc.ViewPage(Of dsNorth.CestaDataTable) End Class 67) Reconfigure a query da cesta de compras (dentro do dataset dsNorth), criando um relacionamento com a tabela products e trazendo o nome do produto
68) Voltando para a view cesta.aspx, faça um for/each em torno da segunda linha da tabela, sendo a repetição para cada linha da dataTable cesta : 1: <% For Each r As siteCesta.dsNorth.CestaRow In ViewData %> 2: <tr> 3: <td> 4: <%= r.ProductName%></td> 5: <td>6: <%= String.Format("{0:C}", r.Preco) %></td> 7: <td> 8: <%= r.Quant %></td> 9: <td>10: <%= String.Format("{0:C}", r.Preco * r.Quant) %></td> 11: </tr>12: <% Next %>
69) Preencha as células com os valores dos campos utilizando a variável r : 1: <% For Each r As siteCesta.dsNorth.CestaRow In ViewData %> 2: <tr> 3: <td> 4: <%= r.ProductName%></td> 5: <td>6: <%= String.Format("{0:C}", r.Preco) %></td> 7: <td> 8: <%= r.Quant %></td> 9: <td>10: <%= String.Format("{0:C}", r.Preco * r.Quant) %></td> 11: </tr>12: <% Next %>
70) Voltando para a view listarprodutos.aspx, logo acima da tabela insira o seguinte código (através do source) : 1: <%= Html.ActionLink(Of siteCesta.CestaController)(New Action(Of siteCesta.CestaController)(Function(x As siteCesta.CestaController) x.Listar), "Ver Cesta de Compras") %>
1: <%= Html.ActionLink("Ver cesta de compras", "listar", "Cesta") %>
71) Execute para testar. Faça compras e visualize a cesta de compras
72) No dsNorth, tableAdapter de cesta, crie uma nova query com o nome de AtualizarQuantidade e a seguinte instrução SQL : 1: UPDATE Cesta 2: SET Quant = @Quant 3: WHERE (ProductId = @ProductId) AND (UserId = @UserId)
73) No CestaController crie o método AtualizarQuantidade com o seguinte código : Function AlterarQuantidade(ByVal idusuario As String, ByVal idproduto As String) Dim ta As New dsNorthTableAdapters.CestaTableAdapter ta.AtualizarQuantidade(ReadFromRequest("txtquant"), idproduto, idusuario)
RedirectToAction("Listar")
End Function
74) Na view Cesta.aspx, na coluna quantidade, crie um formulário preparado para disparar o método AlterarQuantidade : 1: <td>2: <% Using Html.Form(Of siteCesta.CestaController)(New Action(Of siteCesta.CestaController)(Function(x As siteCesta.CestaController) x.AlterarQuantidade(r.UserId, r.ProductId)))%> 3: <%= r.Quant %>4: <% End Using %> 5: </td>
75) Crie uma textbox para conter a quantidade : 1: <td>2: <% Using Html.Form(Of siteCesta.CestaController)(New Action(Of siteCesta.CestaController)(Function(x As siteCesta.CestaController) x.AlterarQuantidade(r.UserId, r.ProductId)))%> 3: <%= Html.TextBox("txtquant", r.Quant, 10, 5) %> 4: <% End Using %> 5: </td>
76) Crie um botão para que seja efetivada a alteração da quantidade 1: <td>2: <% Using Html.Form(Of siteCesta.CestaController)(New Action(Of siteCesta.CestaController)(Function(x As siteCesta.CestaController) x.AlterarQuantidade(r.UserId, r.ProductId)))%> 3: <%= Html.TextBox("txtquant", r.Quant, 10, 5) %> 4: <%= Html.SubmitButton("cmdAlterar", "Alterar Quantidade") %> 5: <% End Using %> 6: </td>
77) Teste o site e experimente alterar a quantidade de produtos na cesta de compras 78) Insira a imagem deletar.gif (nos downloads deste artigo) na pasta content 79) No dsNorth, tableAdapter de cesta, crie um método deletarItem com o seguinte SQL : Function Remover(ByVal idUsuario As String, ByVal idProduto As String) Dim ta As New dsNorthTableAdapters.CestaTableAdapter ta.DeletarItem(idUsuario, idProduto) RedirectToAction("Listar")
End Function 80) Na view Cesta.aspx, na 2a linha, adicione uma coluna no inicio da linha com um formulário disparando a ação de remover : 1: <td><% Using Html.Form(Of siteCesta.CestaController)(New Action(Of siteCesta.CestaController)(Function(x As siteCesta.CestaController) x.Remover(r.UserId, r.ProductId)))%> 2:
3: <% End Using %> 4: </td>
81) Crie um botão ImageSubmit para atuar como botão deletar da cesta : 1: <td><% Using Html.Form(Of siteCesta.CestaController)(New Action(Of siteCesta.CestaController)(Function(x As siteCesta.CestaController) x.Remover(r.UserId, r.ProductId)))%> 2: <%= Html.SubmitImage("imgDeletar", "/Content/deletar.gif") %> |