153 votes

Comment rediriger vers une page en utilisant le verbe POST ?

Lorsque vous appelez RedirectToAction dans un contrôleur, il redirige automatiquement en utilisant un GET HTTP. Comment puis-je lui demander explicitement d'utiliser un HTTP POST ?

J'ai une action qui accepte les requêtes GET et POST, et je veux être capable de RedirectToAction en utilisant POST et en lui envoyant des valeurs.

Comme ça :

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

Je veux le someValue y anotherValue à envoyer en utilisant un HTTP POST au lieu d'un GET. Quelqu'un sait-il comment faire ?

169voto

Jason Bunting Points 27534

Pour votre exemple particulier, je ferais simplement cela, puisque vous ne vous souciez manifestement pas de faire en sorte que le navigateur obtienne la redirection de toute façon (en vertu de l'acceptation de 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'y a pas vraiment de problème - cela vous permet de maintenir le fait que le second n'accepte réellement que les requêtes HTTP POST (sauf dans ce cas, qui est de toute façon sous votre contrôle) et vous n'avez pas besoin d'utiliser TempData non plus, ce que suggère le lien que vous avez posté dans votre réponse.

J'aimerais bien savoir ce qui ne va pas dans ce cas, s'il y a quelque chose. De toute évidence, 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 cela vous aidera.

122voto

Eli Courtwright Points 53071

HTTP ne prend pas en charge la redirection vers une page à l'aide de POST. Lorsque vous redirigez une page, l'en-tête HTTP "Location" indique au navigateur où il doit se rendre, et le navigateur effectue une requête GET pour cette page. Vous devrez probablement écrire le code de votre page pour qu'elle accepte les requêtes GET et les requêtes POST.

24voto

Otto Kanellis Points 530

Si vous souhaitez faire passer 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;

VER

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

TempData est censée être une instance de très courte durée, et vous ne devez l'utiliser que pendant la requête actuelle et les suivantes ! Puisque TempData fonctionne de cette manière, vous devez savoir avec certitude quelle sera la prochaine demande, et 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.

3voto

La réponse affichée par Jason fonctionnera dans la plupart des scénarios, le seul problème que je vois est qu'elle est sujette à des accidents, par exemple l'appel direct d'une méthode d'action. contourne tous les filtres appliquée à l'action. Ainsi, en cas d'authentification ou de filtre de comptoir appliqué à la méthode d'action, ces données peuvent être perdues. L'appel direct d'une méthode d'action fonctionne, mais il doit être appliqué avec précaution.

-1voto

Sinaesthetic Points 2693

Je suis très en retard sur ce sujet, mais je voulais m'assurer que ce message soit intégré dans ce fil pour les autres :

Ajoutez ceci à l'intérieur de votre formulaire :

<input name="X-HTTP-Method-Override" type="hidden" value="DELETE" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X