Pregunta

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

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

Me gusta esto:

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

Quiero que los valores someValue y anotherValue se envíen utilizando un HTTP POST en lugar de un GET. ¿Alguien sabe cómo hacer esto?

¿Fue útil?

Solución

HTTP no admite la redirección a una página usando POST. Cuando redirige a alguna parte, la ubicación HTTP " El encabezado le dice al navegador a 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 POST.

Otros consejos

Para su ejemplo particular, simplemente haría esto, ya que obviamente no le importa que el navegador obtenga 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 ' tampoco tengo que usar TempData, que es lo que sugiere el enlace que publicaste en tu respuesta.

Me encantaría saber qué está "mal" con esto, si hay algo. Obviamente, si realmente desea haber enviado al navegador una redirección, esto no va a funcionar, pero luego debe preguntarse por qué intentaría convertir eso de todos modos, ya que me parece extraño.

Espero que eso 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. Dado que TempData funciona de esta manera, debe saber con certeza cuál será la próxima solicitud, y la redirección a otra vista es la única vez que puede garantizarlo.

Por lo tanto, el único escenario en el que usar 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>");

Me gustaría ampliar la respuesta de Jason Bunting

como este

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

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

Puede obtener todos los tipos de controlador

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top