Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Estou com dúvida no curso de ASP.NET MVC: Desenvolvendo para Web, no exercício do capítulo Requisições elegantes com AJAX.

O exercício não funcionou do mesmo jeito que foi demonstrado na aula. ... using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using CaelumEstoque.Models; using CaelumEstoque.Dao;

namespace CaelumEstoque.Controllers { public class ProdutoController : Controller { // // GET: /Produto/

public ActionResult Index() { ProdutoDao dao = new ProdutoDao(); List produtos = dao.Lista(); return View(produtos); }

public ActionResult Form() { ViewBag.Produto = new Produto { Categoria = new CategoriaDoProduto() };

CategoriaDao dao = new CategoriaDao(); List categorias = dao.Lista(); return View(categorias); }

[HttpPost] public ActionResult Adiciona(Produto produto) { int idDaInformatica = 1; if (produto.Categoria.Id.Equals(idDaInformatica) && produto.Preco < 100) { ModelState.AddModelError("produto.informaticaComPrecoInvalido", "Produtos da Categoria Informárica devem custar mais de 100"); } if (ModelState.IsValid) { ProdutoDao produtoDAO = new ProdutoDao(); produtoDAO.Salva(produto); return RedirectToAction("Index"); } else { ViewBag.Produto = produto; CategoriaDao categoriaDAO = new CategoriaDao(); List categorias = categoriaDAO.Lista(); return View("Form", categorias); } }

[HttpPost] public ActionResult BlackList([BindAttribute(Exclude = "Quantidade,Categoria.Id,Preco")] Produto produto) { return View(produto); }

[HttpPost] public ActionResult WhiteList([BindAttribute(Include = "Nome,Id")] Produto produto) { return View(produto); }

public ActionResult Visualiza(int id) { ProdutoDao produtoDAO = new ProdutoDao(); Produto produto = produtoDAO.BuscaPorId(id); return View(produto); }

[HttpPost] public ActionResult DecrementaQuantidade(int produtoId) { ProdutoDao dao = new ProdutoDao(); Produto produto = dao.BuscaPorId(produtoId); if (produto.Quantidade > 0) { produto.Quantidade--; dao.Atualiza(produto); } return Json(produto); }

} } ... @model List

ID Nome do Produto Preço Quantidade @foreach (var produto in Model) {

@produto.Id @Html.RouteLink(produto.Nome, "VisualizaProduto", new{id = produto.Id}) @produto.Preco @produto.Quantidade Decrementa Quantidade }

...

6 respostas

Olá Antonio,

Encontrar problema em códigos Ajax pode ser uma tarefa complexa, devido ao uso de diversas tecnologias diferentes em conjunto. Vamos por partes? Coloque um breakpoint no código da lógica que decrementa a quantidade (ela fica no Controller ProdutoController, o a action é a DecrementaQuantidade()). Clique no link gerado na página e veja se o breakpoint é atingido. O propósito desse teste é descobrir se o link está conseguindo chegar na lógica, que seria a primeira parte do processo. Para colocar um breakpoint na linha de código, aperte F9 com o cursor sobre a linha. Execute o programa usando F5 (executa em modo debug) e tente clicar no link. Poste aqui o que houve - chegou na lógica, ou não? Assim fica melhor descobrirmos o que houve.

Abraços

Oi Osni, obrigado pela resposta. Me parece que o problema está na chamada ajax. Ao colocar o breakpoint no Controller dá pra ver que o método não é chamado. Na console do Google Chrome aparece o erro HTTP 500 (Internal Server Error). Minha rotina javascript é a seguinte: ... function decrementaQuantidade(Id) {

var parametros = { produtoId: Id }; $.post("@Url.Action("DecrementaQuantidade", "Produto")", parametros, atualizaQuantidade); return false; } ... e o Controller ... [HttpPost] public ActionResult DecrementaQuantidade(int produtoId) { ProdutoDao dao = new ProdutoDao(); Produto produto = dao.BuscaPorId(produtoId); if (produto.Quantidade > 0) { produto.Quantidade--; dao.Atualiza(produto); } return Json(produto); } ...

Já que você comentou sobre o console do Chrome, dê uma olhada na aba "Network". Lá, você consegue ver exatamente a requisição que está sendo enviada. O erro HTTP 500 normalmente é causado por uma Exception na lógica. Se nem chega até a lógica, pode ser que a requisição esteja com problemas. Se você não conseguir encontrar problemas onde comentei, tente fazer essa requisição para o DecrementaQuantidade() sem Ajax - crie um Link que chama a lógica. No final da lógica, renderize a listagem novamente (pode fazer return RedirectToAction("Index");). Se funcionar, o problema está na requisição Ajax. Se não funcionar, o problema está do lado do Server (pode ser rota, model binder, etc.)

Verifique através da console do Chrome e a mensagem dizia que eu não estava passando um parâmetro (id) obrigatório. O que não entendi é que eu estou chamando o método DecrementaProduto() e pela mensagem de erro parecia que eu estava chamando o método "Visualiza(int Id)". Retirei a rota para o método Visualiza() do global.asa e começou a funcionar normalmente. Obrigado pelas dicas... Foram muito úteis....

Depois reveja a questão das rotas. Qualquer coisa diferente que você colocar lá, pode quebrar algo no seu programa - como aconteceu. Lembre-se que as rotas sempre vão ser verificadas na seqüência em que foram definidas, e um "match" pra uma rota impede que a seguinte seja verificada. Qualquer coisa é só postar!

solução!

.