web-dev-qa-db-fra.com

Comment rediriger vers une page en utilisant le verbe POST?

Lorsque vous appelez RedirectToAction dans un contrôleur, il redirige automatiquement à l'aide d'un HTTP GET. Comment lui dire explicitement d'utiliser un HTTP POST?

J'ai une action qui accepte à la fois les requêtes GET et POST), et je veux pouvoir utiliser RedirectToAction avec POST et lui envoyer des valeurs .

Comme ça:

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

Je veux que les valeurs someValue et anotherValue soient envoyées à l'aide d'un HTTP POST au lieu d'un GET. Est-ce que quelqu'un sait comment faire cela?

120
Chris Pietschmann

HTTP ne prend pas en charge la redirection vers une page à l'aide de POST. Lorsque vous redirigez quelque part, l'en-tête HTTP "Location" indique au navigateur où aller et le navigateur fait une demande GET pour cette page. Vous devrez probablement écrire le code de votre page pour accepter les requêtes GET ainsi que les requêtes POST.

96
Eli Courtwright

Pour votre exemple particulier, je voudrais simplement faire ceci, car vous ne vous souciez évidemment pas de laisser le navigateur recevoir la redirection de toute façon (en acceptant la réponse que vous avez déjà acceptée):

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

Cela fonctionne facilement et il n’ya aucune activité amusante en cours - cela vous permet de garder le fait que le second accepte uniquement les requêtes HTTP POST (sauf dans ce cas, qui est sous votre contrôle) de toute façon) et vous n’avez pas à utiliser TempData non plus, c’est ce que suggère le lien que vous avez posté dans votre réponse.

J'aimerais savoir ce qui ne va pas avec cela, s'il y a quelque chose. Évidemment, si vous voulez vraiment envoyer une redirection au navigateur, cela ne fonctionnera pas, mais vous devriez alors vous demander pourquoi vous essayez de convertir cela malgré tout, car cela me semble étrange.

J'espère que ça t'as aidé.

151
Jason Bunting

Si vous souhaitez transmettre des données entre deux actions lors d'une redirection sans inclure de données dans la chaîne de requête, placez le modèle dans l'objet TempData.

ACTION

TempData["datacontainer"] = modelData;

VUE

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

TempData est censé être une instance de très courte durée, et vous ne devriez l'utiliser que pendant les requêtes en cours et suivantes uniquement! Puisque TempData fonctionne de cette façon, vous devez savoir avec certitude quelle sera la prochaine requête. La redirection vers une autre vue est le seul moment où vous pouvez le garantir.

Par conséquent, le seul scénario dans lequel l'utilisation de TempData fonctionnera de manière fiable est celui de la redirection.

18
Otto Kanellis

essaye celui-là

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

J'aimerais développer la réponse de Jason Bunting

comme ça

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

Et Eli sera ici pour quelque chose idée sur la façon de le rendre variable générique

Peut recevoir tout type de contrôleur

4
Yitzhak Weinberg