Usuário com melhor resposta
HttpPost Edit X Delete

Pergunta
-
Pessoal,
Estou começando agora com o MVC e fazendo aqui um aplicativo para testes me deparei com uma situacao que ainda nao consegui entender, primeiro vou mostrar o codigo para edicao:
// Edit - GET public ActionResult Edit(int id) { var _cli = new Cliente(id); return View(_cli); } // Edit - Post [HttpPost] public ActionResult Edit(Cliente cliente) { var _cli = new Cliente(); _cli.ClienteId = cliente.ClienteId; _cli.Nome = cliente.Nome; _cli.Email = cliente.Email; _cli.Telefone = cliente.Telefone; _cli.Atualiza(); return RedirectToAction("Index"); }
Agora o codigo para excluir:
// Delete - GET public ActionResult Delete(int id) { var _cli = new Cliente(id); return View(_cli); } // Delete - POST [HttpPost] public ActionResult Delete(Cliente ClienteExcluir) { var _cli = new Cliente(); _cli.Excluir(ClienteExcluir.ClienteId); return RedirectToAction("Index"); }
O problema esta exatamento no meu metodo delete/post pois coloquei como parametro um objeto Cliente e meu ClienteExcluir.ClienteId esta vindo com o valor zerado. No metodo de edicao eu fiz a mesma coisa e funciona normalmente. O fato é que se eu fizer assim:
[HttpPost] public ActionResult Delete(int id, FormCollection Collection) { var _cli = new Cliente(); _cli.Excluir(id); return RedirectToAction("Index"); }
Funciona perfeitamente. O que eu estou fazendo de errado? Obrigado pela atencao.Abs!
Respostas
-
Em MVC3 ficaria assim:
//Index:
@Html.ActionLink("Excluir", "Delete", new { id = item.ID})
//Controller: // GET: /Apontamento/Delete/5 public ActionResult Delete(int id) { Cliente cli = db.Cliente .Single(a => a.ID == id); return View(cli); } // // POST: /Apontamento/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { Cliente cli = db.Cliente .Single(a => a.ID == id); db.Apontamento.DeleteObject(cli); db.SaveChanges(); return RedirectToAction("Index"); }
- Marcado como Resposta Marcelo Moreira Souza terça-feira, 31 de maio de 2011 14:25
Todas as Respostas
-
Olá Marcelo Moreira Souza,
Antes de mais nada uma dica muito importante: não execute uma operação que altera o estado da sua aplicação (como o delete) via get. Esta operação pode ser executada através da tag img ou script, por exemplo, que executam um get para recuperar recursos.
Somente olhando o código que você passou não dá para saber qual é o problema. Mas, observando este código:
[HttpPost] public ActionResult Delete(int id, FormCollection Collection) { var _cli = new Cliente(); _cli.Excluir(id); return RedirectToAction("Index"); }
Parece que o id é suficiente para você deletar. Você pode receber apenas o id e deletar. Desta forma:
[HttpPost] public ActionResult Delete(int id) { var _cli = new Cliente(); _cli.Excluir(id); return RedirectToAction("Index"); }
Você não precisa necessariamente passar o objeto Cliente ou o FormCollection. Alguma razão específica para receber algo além do id nesta action?
Espero ter ajudado.
Allan -
Allan
Eu so levantei a duvida porquei aqui:
// Edit - Post
[HttpPost]
public ActionResult Edit(Cliente cliente)
cliente.clienteIdEle retorna a informacao correta mas no metodo Delete nao funcionou.
Pegando apenas o id como vc mesmo postou funciona perfeitamente.
Para realizar este processo de deletar o registro entao eu nao precisariao dos dois metodas abaixo, um get e outro post:
// Delete - GET public ActionResult Delete(int id) { var _cli = new Cliente(id); return View(_cli); } // Delete - POST [HttpPost] public ActionResult Delete(int id, FormCollection Collection) { var _cli = new Cliente(); _cli.Excluir(id); return RedirectToAction("Index"); }
Caso eu tenha que ter os dois no metodo httppost Delete eu nao posso ter como parametro apenas o int id pois a assinatura do metodo ficaria igual ao do get.
Obrigado pela atencao
-
Olá Marcelo Moreira Souza,
Ainda assim, fica meu alerta: operações que alteram o estado da aplicação não devem ser realizadas via get.
Experimente adicionar este código a uma view qualquer:
<img src="/home/delete/1" alt="" />
Onde home será o nome do seu controller. Se você possuir uma action que responde ao get ela será executada. Você pode fazer a segurança via autorização. Ainda assim, você estará expondo sua aplicação a ataques e, potencialmente, criando problemas de segurança na sua aplicação.
Espero ter ajudado.
Allan -
Allan
Esta sua colocacao tambem nao entendi pois o registro nao esta sendo excluido de fato no GET.
Pelo que eu entendi de um material que li ali no get ele esta usando um metodo para exibir as informacoes do registro que sera excluido.
A exclusao de fato vai acontecer no metodo POST no meu:
_cli.Excluir(id)
Entendi errado?
-
-
Allan
Veja um codigo gerado pelo proprio Visual Studio 2010 em uma aplicacao ASP.NET MVC 2
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApplication15.Controllers { public class ClienteController : Controller { // // GET: /Cliente/ public ActionResult Index() { return View(); } // // GET: /Cliente/Details/5 public ActionResult Details(int id) { return View(); } // // GET: /Cliente/Create public ActionResult Create() { return View(); } // // POST: /Cliente/Create [HttpPost] public ActionResult Create(FormCollection collection) { try { // TODO: Add insert logic here return RedirectToAction("Index"); } catch { return View(); } } // // GET: /Cliente/Edit/5 public ActionResult Edit(int id) { return View(); } // // POST: /Cliente/Edit/5 [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { // TODO: Add update logic here return RedirectToAction("Index"); } catch { return View(); } } // // GET: /Cliente/Delete/5 public ActionResult Delete(int id) { return View(); } // // POST: /Cliente/Delete/5 [HttpPost] public ActionResult Delete(int id, FormCollection collection) { try { // TODO: Add delete logic here return RedirectToAction("Index"); } catch { return View(); } } } }
Veja que ele gerou dois metodos Delete um Get e outro Post
Pelo que eu entendi o Delete Get busca as informacoes do gegistro a ser deletado, mostra na tela e pede pro usuario confirmar a operacao de deletar o registro. Ja o Delete post realiza de fato a acao de excluir o registro no banco.
Como estou começando agora com o MVC esta parte que ainda nao ficou claro.
De qualquer forma obrigado pela atenção
-
Em MVC3 ficaria assim:
//Index:
@Html.ActionLink("Excluir", "Delete", new { id = item.ID})
//Controller: // GET: /Apontamento/Delete/5 public ActionResult Delete(int id) { Cliente cli = db.Cliente .Single(a => a.ID == id); return View(cli); } // // POST: /Apontamento/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { Cliente cli = db.Cliente .Single(a => a.ID == id); db.Apontamento.DeleteObject(cli); db.SaveChanges(); return RedirectToAction("Index"); }
- Marcado como Resposta Marcelo Moreira Souza terça-feira, 31 de maio de 2011 14:25
-