none
Post o Get para accion de eliminar registros RRS feed

  • Pregunta

  • hola gente :) quisiera saber cual me conviene mas usar para mi accion de eliminar un registro de anuncio, Get o Post, resulta que tengo una vista llamada EditarPublicacion,

    en esta vista tengo un boton tipo submit para actualizar los campos, pero tambien tengo un actionLink que apunta a la accion EliminarPublicacion.

    la Accion Eliminar publicacion en el controlador tiene en su cabecera [AccpetVeerbs(httpVerbs.Get)]

    y la cosa funciona bien, porque cuando cambio el get por un post la accion no me funciona, hay lagun problema en usar el Get? quiero decir tiene alguna repercucion negativa? en mi aplicacion?

    Gracias abrazos a todos =)

     

    domingo, 31 de julio de 2011 22:33

Respuestas

  • Hola juanita, hace poco pase por lo mismo, lo que hice es bien simple, en el get de la accion eliminar devolvi una PartialView, esta vista parcial apenas contiene un <input type="submit">, luego en el post de la accion elimino el registro; el detalle esta en incrustar la partialView en la vista desde donde deseas eliminar el registro, en mi caso era la vista EditarAnuncio, entonces asi elimino el anuncio desde el formulario de edicion de anuncios, o almenos ese es el efecto que percibe el usuario, asi evitas mostrar esa "advertencia" de que se eliminara un registro y mantienes el patron Get/Post. Espero que te sirva.

    Saludos =)



    • Marcado como respuesta Juanita.net miércoles, 31 de agosto de 2011 14:43
    miércoles, 31 de agosto de 2011 4:02

Todas las respuestas

  • Hola

     

    Cuando tu creas un controlador a partir de un modelo, normalmente se crean dos metodos para realizar Delete, uno marcado con Get y el otro macado con Post. 

    El Get es para devolver los datos antes de Eliminar, como si pidieses confirmación antes de eliminar. El post lo que hace es eliminar el Registro y 

    después redireccionar al Index, Perfectamente podrías eliminar el Get si tu aplicación no necesita realizar ninguna confirmación antes de Eliminar.

     

    Te paso una lectura recomendable, para que todo esto te quede claro. 

     

    Patrón Post-Redirect-Get

     

    Saludos,


    phurtado
    domingo, 31 de julio de 2011 22:58
  • Hola..

    El verdadero problema lo tienes aquí.. "tengo un actionLink que apunta a la accion EliminarPublicacion"

    Si tienes un ActionLink que apunta a la acción, eso en HTML se traducirá a un anchor.. <a.../> y, este elemento HTML siempre genera un GET al servidor. Si cambias el GET por el POST en tu controlador, estás diciendo que esa acción ya no acepta GET, por lo que el ActionLink te fallará..

    Para que funcione, no deberías usar el ActionLink, quizás ejecutar el POST por ajax, por proponer una solución...

     

    Espero te sirva, Salu2

     


    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise NET 3.5.

    Mi perfil: My geeks
    Colaborador: www.secondnug.com
    • Propuesto como respuesta Pedro Hurtado jueves, 4 de agosto de 2011 20:38
    jueves, 4 de agosto de 2011 19:36
    Moderador
  • Exacto!

    @Juanita.net Échale un vistazo al enlace que te pasa Pedro porque es un patrón fundamental en las aplicaciones web.

    Básicamente una norma que debería ser obligatoria en toda aplicación web (que no siempre se cumple) es que GET debería ser idempotente. Es decir, una acción llamada via GET nunca debería generar ningún cambio de estado en nuestra aplicación. O dicho de forma más simple: GET es sólo para consultas.

    Porque? Por seguridad: Si tu permites que una URL tipo /Clientes/Borrar/10 llamada via GET BORRE al cliente con ID de 10, entonces yo puedo crear p.ej. un correo y incluir en él algo parecido a <img src="http://www.tuaplicacion.com/Clientes/Borrar/10" heigth="1" width="1" /> y... quien mire el mail... va a borrar el cliente con ID 10 :)

    En cambio un crossdomain con POST es mucho más dificil, requiere javascript, saltan alertas de seguridad, etc, etc...

    Así que resumiendo: nunca uses GET para nada que NO sea de lectura... o tarde o temprano vas a tener algún problema :)

    Saludos! ;-)


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    • Propuesto como respuesta JA Reyes miércoles, 31 de agosto de 2011 7:00
    sábado, 6 de agosto de 2011 9:33
  • Caballeros muchas gracias por las sugestiones,  entiendo lo que dice Pedro, uso el Get para mostrar algo que seria como una advertencia( mostrando digamos el nombre de mi anuncio) antes de realizar el cambio( en mi caso el delete) en la BD, pero en mi aplicacion no quisiera mostrar esa advertencia, lo que hice es poner una accion en el evento onclick que al dar click sobre el enlace me muestra un mensaje, aqui les dejo mi ActionLink:

    <%=Html.ActionLink("Eliminar la Publicacion","EliminarPublicacion","Publicaciones",new{id=Model.Publicacion.IDPublicacion},new{ onclick = "return confirm('Esta acción es irreversible, desea continuar?');"}) %>

    Entonces con la accion onclick creo que estoy controlando el problema que plantea Eduard, pero porfavor si estoy equivocada espero me puedan corregir y dar alguna alternativa, lo importante es que quiero dar la posibilidad de borrar el anuncio directamente desde la View EditarAnuncio, sin mandar la advertencia de que se va a borrar a  travez de otra view que supongo vendria en el Get de la accion EliminarAnuncio. Espero me hayan podido comprender.

    Abrazos a todos :)


    • Editado Juanita.net miércoles, 31 de agosto de 2011 4:05
    jueves, 11 de agosto de 2011 14:56
  • Hola Juanita...

    Mientras uses ActionLink, vas a generar un achor <a/> al html, eso se comunica con el servidor mediante un GET. Si "EliminarAnuncio" se realiza por get, siempre existirá el riesgo de que yo escriba directamente la URL que invoca a la acción en el navegador y elimine la publicación..

    Una solución sería marcar tu acción para que solo pueda ser invocada por POST, luego puedes usar Ajax (jquery) para invocar la acción....

    Función en javascript para invocar la acción por post: (requiere jquery)

    function DeletePost(id)
    {
       if (confirm('Esta acción es irreversible, desea continuar?'))
       {
          $.post('/Anuncios/EliminarAnuncio/' + id);
       }
    }

     

    Salu2


    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise NET 3.5.

    Mi perfil: My geeks
    Colaborador: www.secondnug.com
    jueves, 11 de agosto de 2011 15:08
    Moderador
  • Una pequeña corrección... :)

    function DeletePost(id)
    {
       if (confirm('Esta acción es irreversible, desea continuar?'))
       {
         $.post('/Anuncios/EliminarAnuncio', {'id': id} );
       }
    }

    Asumo que "id" es el nombre del parámetro en tu acción..

     

    Salu2


    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise NET 3.5.

    Mi perfil: My geeks
    Colaborador: www.secondnug.com
    jueves, 11 de agosto de 2011 15:14
    Moderador
  • Hola juanita, hace poco pase por lo mismo, lo que hice es bien simple, en el get de la accion eliminar devolvi una PartialView, esta vista parcial apenas contiene un <input type="submit">, luego en el post de la accion elimino el registro; el detalle esta en incrustar la partialView en la vista desde donde deseas eliminar el registro, en mi caso era la vista EditarAnuncio, entonces asi elimino el anuncio desde el formulario de edicion de anuncios, o almenos ese es el efecto que percibe el usuario, asi evitas mostrar esa "advertencia" de que se eliminara un registro y mantienes el patron Get/Post. Espero que te sirva.

    Saludos =)



    • Marcado como respuesta Juanita.net miércoles, 31 de agosto de 2011 14:43
    miércoles, 31 de agosto de 2011 4:02
  • Hola juanita, hace poco pase por lo mismo, lo que hice es bien simple, en el get de la accion eliminar devolvi una PartialView, esta vista parcial apenas contiene un <input type="submit">, luego en el post de la accion elimino el registro; el detalle esta en incrustar la partialView en la vista desde donde deseas eliminar el registro, en mi caso era la vista EditarAnuncio, entonces asi elimino el anuncio desde el formulario de edicion de anuncios, o almenos ese es el efecto que percibe el usuario, asi evitas mostrar esa "advertencia" de que se eliminara un registro y mantienes el patron Get/Post. Espero que te sirva.

    Saludos =)



    Eba!! gracias por la ayuda funciona perfecto, solo hay que aclarar que es necesario usar dos formularios en la misma vista para que funcione.

    Muchas gracias richof un gran abrazo y a todos los que respondieron :)))))

    miércoles, 31 de agosto de 2011 14:45