2008-09-24 12 views
94

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

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

De esta manera:

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

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

Respuesta

84

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.

+4

Curioso por qué mi respuesta no es aceptada, creo que mi retórica es sólida. :) Por otra parte, puedo ser un poco parcial al respecto ... –

+12

Si bien esta respuesta es básicamente correcta, no está completa. Vea la respuesta de Jason Bunting a continuación para una solución mucho mejor. –

132

Para su ejemplo particular, me acaba de hacer esto, ya que es obvio que no se preocupa por tener realmente el navegador conseguir la redirección de todas formas (en virtud de la aceptación de 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 ningún negocio divertido realmente en marcha; 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 para usar TempData tampoco, que es lo que está sugiriendo el enlace que publicaste en tu 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.

+7

Quién sabe por qué se votó negativamente. Este es un método muy útil. –

+1

También funciona para mí, gracias. –

+2

Así es como siempre he resuelto este problema también. Bajar votos esto no tiene sentido. –

3

La respuesta de jason funcionará en la mayoría de los escenarios, el único problema que veo es que es propenso a accidentes. Es decir, llamar directamente a un método de acción omite 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.

16

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;

VISTA

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

TempData está destinado a ser una instancia de muy corta vida, y sólo se debe utilizar durante el curso y sólo los subsiguientes peticiones! 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.

4

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

me gustaría ampliar la respuesta de Jason Bunting

como éste

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

Y Eli estará aquí por algo idea sobre cómo hacerlo variable genérica

Puede obtener todos los tipos de controlador

Cuestiones relacionadas