net mvc asp asp.net-mvc url-redirection

asp.net mvc - mvc - ¿Cómo redirige a una página usando el verbo POST?



mvc redirect to action (6)

Cuando llama a RedirectToAction dentro de un controlador, lo redirige automáticamente utilizando un HTTP GET. ¿Cómo le digo explícitamente que use HTTP POST?

Tengo una acción que acepta las solicitudes GET y POST, y quiero poder RedirectToAction a la acción usando POST y enviarle algunos valores.

Me gusta esto:

this.RedirectToAction( "actionname", new RouteValueDictionary(new { someValue = 2, anotherValue = "text" }) );

Quiero que se someValue valores someValue y anotherValue utilizando un HTTP POST en lugar de un GET. ¿Alguien sabe como hacer esto?


HTTP no admite la redirección a una página mediante POST. Cuando redirige a alguna parte, el encabezado HTTP "Ubicación" le dice al navegador dónde ir, y el navegador realiza una solicitud GET para esa página. Probablemente tendrá que escribir el código de su página para aceptar solicitudes GET y solicitudes POST.


La publicación de respuestas de Jason funcionará en la mayoría de los escenarios, el único problema que veo es que es propenso a los accidentes. es decir, llamar a un método de acción evita directamente todos los filtros aplicados a la acción. Por lo tanto, en caso de que haya algún filtro de autentificación o contador aplicado al método de acción, esos datos podrían perderse. Llamar directamente a un método de acción funcionará, pero debe aplicarse con cuidado.


Me gustaría expandir la respuesta de Jason Bunting

Me gusta esto

ActionResult action = new SampelController().Index(2, "text"); return action;

Y Eli estará aquí para tener una idea sobre cómo hacer que sea una variable genérica

Puede obtener todos los tipos de controlador


Para su ejemplo particular, simplemente haría esto, ya que obviamente no le importa que el navegador reciba la redirección de todos modos (en virtud de aceptar la respuesta que ya ha aceptado):

[AcceptVerbs(HttpVerbs.Get)] public ActionResult Index() { // obviously these values might come from somewhere non-trivial return Index(2, "text"); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(int someValue, string anotherValue) { // would probably do something non-trivial here with the param values return View(); }

Eso funciona fácilmente y no hay realmente ningún negocio divertido: esto le permite mantener el hecho de que el segundo realmente solo acepta solicitudes HTTP POST (excepto en este caso, que está bajo su control de todos modos) y usted no tiene que use TempData tampoco, que es lo que está sugiriendo el enlace que publicó en su respuesta.

Me encantaría saber qué está "mal" con esto, si hay algo. Obviamente, si realmente quieres enviar un redireccionamiento al navegador, esto no funcionará, pero entonces deberías preguntar por qué intentas convertir eso independientemente, ya que me parece extraño.

Espero que ayude.


Si desea pasar datos entre dos acciones durante una redirección sin incluir ningún dato en la cadena de consulta, coloque el modelo en el objeto TempData.

ACCIÓN

TempData["datacontainer"] = modelData;

VER

var modelData= TempData["datacontainer"] as ModelDataType;

TempData está destinado a ser una instancia de muy corta duración, y solo debe usarlo durante las solicitudes actuales y posteriores únicamente. Dado que TempData funciona de esta manera, debe saber con certeza cuál será la próxima solicitud, y redirigir a otra vista es la única vez que puede garantizar esto.

Por lo tanto, el único escenario donde el uso de TempData funcionará de manera confiable es cuando está redirigiendo.


prueba este

return Content("<form action=''actionname'' id=''frmTest'' method=''post''><input type=''hidden'' name=''someValue'' value=''" + someValue + "'' /><input type=''hidden'' name=''anotherValue'' value=''" + anotherValue + "'' /></form><script>document.getElementById(''frmTest'').submit();</script>");