none
HttpPost Edit X Delete RRS feed

  • 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!

    quarta-feira, 25 de maio de 2011 03:22

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"); }

     




    quinta-feira, 26 de maio de 2011 00:23

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
    quarta-feira, 25 de maio de 2011 14:43
  • Allan

    Eu so levantei a duvida porquei aqui:

    // Edit - Post
        [HttpPost]   
        public ActionResult Edit(Cliente cliente)
    cliente.clienteId

    Ele 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

    quarta-feira, 25 de maio de 2011 17:38
  • 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
    quarta-feira, 25 de maio de 2011 19:27
  • 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?

    quarta-feira, 25 de maio de 2011 19:43
  • Olá Marcelo Moreira Souza,

    Se a action Delete não exclui o registro, sugiro que você reveja o nome da mesma. Sua api deve ser tão clara quanto possível.

    Espero ter ajudado.


    Allan
    quarta-feira, 25 de maio de 2011 21:07
  • 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

    quarta-feira, 25 de maio de 2011 22:58
  • 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"); }

     




    quinta-feira, 26 de maio de 2011 00:23
  • Provavelmente o Hidden q guarda o ID chama id e não ClientId. Ele não vai conseguir bindar com ClienteId por isso

     

    Pelo q deu pra entender do seu primeiro código é isso


    1000ton Analista de Sistema Plastripel - Barretos @MiltonFilho
    segunda-feira, 30 de maio de 2011 15:09