Pergunta

Quando você chama RedirectToAction dentro de um controlador, ele automaticamente redireciona usando um HTTP GET. Como posso dizer isso explicitamente para usar um HTTP POST?

Eu tenho uma ação que aceita tanto solicitações GET e POST, e eu quero ser capaz de RedirectToAction usando POST e enviá-lo alguns valores.

Como esta:

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

Eu quero que os valores someValue e anotherValue a ser enviado com um HTTP POST em vez de um GET. Alguém sabe como fazer isso?

Foi útil?

Solução

HTTP não suporta redirecionamento para uma página usando POST. Quando você redirecionar algum lugar, o HTTP "Location" cabeçalho diz ao navegador para onde ir, eo navegador faz uma solicitação GET para essa página. Você provavelmente vai ter que basta escrever o código para sua página para aceitar solicitações GET, bem como solicitações POST.

Outras dicas

Para o seu exemplo em particular, gostaria apenas de fazer isso, desde que, obviamente, não se preocupam realmente ter o browser obter o redirecionamento de qualquer maneira (em virtude de aceitar a resposta que você já aceitou):

[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();
}

Isso funciona de forma fácil e não há nenhum negócio engraçado realmente acontecendo - isto permite que você mantenha o fato de que a segunda realmente só aceita pedidos HTTP POST (exceto neste caso, que está sob o seu controle de qualquer maneira) e você don' t tem que usar TempData quer, que é o que o link que você postou em sua resposta está sugerindo.

Eu gostaria de saber o que é "errado" com isso, se há alguma coisa. Obviamente, se você quiser realmente enviou para o navegador um redirecionamento, isso não vai ao trabalho, mas então você deve perguntar por que você estaria tentando converter que, independentemente, uma vez que parece estranho para mim.

Espero que ajude.

Se você quiser transmitir dados entre duas ações durante um redirecionamento sem incluir quaisquer dados na cadeia de consulta, coloque o modelo no objeto TempData.

Action

TempData["datacontainer"] = modelData;

Ver

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

TempData pretende ser uma instância de muito curta duração, e você só deve usá-lo durante o atual e apenas os pedidos subsequentes! Desde TempData funciona dessa maneira, você precisa saber ao certo o que o próximo pedido será, e redirecionando para outro ponto de vista é a única vez que você pode garantir isso.

Portanto, o único cenário onde usar TempData vai confiável trabalho é quando você está redirecionando.

tentar um presente

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

Eu gostaria de expandir a resposta de Jason Bunting

como este

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

E Eli estará aqui para a idéia algo sobre a forma de torná-lo variável genérico

Pode obter todos os tipos de controlador

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top