Question

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 les requêtes GET et POST et je veux pouvoir RedirectToAction en utilisant POST et lui envoyer des valeurs.

Comme ceci:

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

Je souhaite 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?

Était-ce utile?

La solution

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

Autres conseils

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 que vous ne le faites pas. Il ne faut pas non plus utiliser TempData, ce que suggère le lien que vous avez posté dans votre réponse.

J'aimerais bien 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.

L’espoir que cela aide.

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;

VIEW

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.

essayez celui-ci

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

Je voudrais développer la réponse de Jason Bunting

comme ceci

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

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

Peut obtenir tous les types de contrôleurs

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top