web-dev-qa-db-ja.com

POST動詞を使用してどのようにページにリダイレクトしますか?

コントローラ内でRedirectToActionを呼び出すと、HTTP GETを使用して自動的にリダイレクトされます。 HTTP POSTを使用するように明示的に指示するにはどうすればよいですか?

GETとPOSTの両方のリクエストを受け付けるアクションがあり、POSTを使用してRedirectToActionになり、いくつかの値を送信できるようにします。

このような:

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

GETではなくHTTP POSTを使用してsomeValueおよびanotherValueの値を送信する必要があります。誰もこれを行う方法を知っていますか?

120

HTTPは、POSTを使用したページへのリダイレクトをサポートしていません。どこかにリダイレクトすると、HTTPの「Location」ヘッダーがブラウザに移動先を指示し、ブラウザはそのページのGETリクエストを作成します。 POSTリクエストだけでなくGETリクエストも受け入れるために、おそらくページのコードを記述する必要があります。

96
Eli Courtwright

あなたの特定の例については、私はこれをやるだけです。なぜなら、あなたは実際にブラウザが実際にリダイレクトを取得することを気にしないからです(すでに受け入れた答えを受け入れることで):

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

これは簡単に機能し、実際に起こっている面白いビジネスはありません-これにより、2番目のリクエストは実際にHTTP POSTリクエストのみを受け入れるという事実を維持できます(とにかくあなたの制御下にあるこのインスタンスを除く) TempDataを使用する必要もありません。これは、回答に投稿したリンクが示唆していることです。

何かあれば、これで何が「間違っている」かを知りたいです。明らかに、本当にブラウザにリダイレクトを送信したい場合、これは機能しませんが、それがどうであれそれを変換しようとするのはなぜかと尋ねる必要があります。

お役に立てば幸いです。

151
Jason Bunting

クエリ文字列にデータを含めずにリダイレクト中に2つのアクション間でデータを渡したい場合は、TempDataオブジェクトにモデルを配置します。

アクション

TempData["datacontainer"] = modelData;

見る

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

TempDataは非常に短命のインスタンスであるため、現在および後続のリクエストでのみ使用する必要があります! TempDataはこのように機能するため、次のリクエストが何であるかを確実に知る必要があり、これを保証できるのは別のビューへのリダイレクトのみです。

したがって、TempDataの使用が確実に機能する唯一のシナリオは、リダイレクトするときです。

18
Otto Kanellis

これを試して

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

ジェイソン・バンティングの答えを広げたい

このような

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

そして、Eliはそれをジェネリック変数にする方法についてのアイデアを求めてここに来ます

すべてのタイプのコントローラーを取得できます

4