コントローラ内でRedirectToAction
を呼び出すと、HTTP GETを使用して自動的にリダイレクトされます。 HTTP POSTを使用するように明示的に指示するにはどうすればよいですか?
GETとPOSTの両方のリクエストを受け付けるアクションがあり、POSTを使用してRedirectToAction
になり、いくつかの値を送信できるようにします。
このような:
this.RedirectToAction(
"actionname",
new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);
GETではなくHTTP POSTを使用してsomeValue
およびanotherValue
の値を送信する必要があります。誰もこれを行う方法を知っていますか?
HTTPは、POSTを使用したページへのリダイレクトをサポートしていません。どこかにリダイレクトすると、HTTPの「Location」ヘッダーがブラウザに移動先を指示し、ブラウザはそのページのGETリクエストを作成します。 POSTリクエストだけでなくGETリクエストも受け入れるために、おそらくページのコードを記述する必要があります。
あなたの特定の例については、私はこれをやるだけです。なぜなら、あなたは実際にブラウザが実際にリダイレクトを取得することを気にしないからです(すでに受け入れた答えを受け入れることで):
[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を使用する必要もありません。これは、回答に投稿したリンクが示唆していることです。
何かあれば、これで何が「間違っている」かを知りたいです。明らかに、本当にブラウザにリダイレクトを送信したい場合、これは機能しませんが、それがどうであれそれを変換しようとするのはなぜかと尋ねる必要があります。
お役に立てば幸いです。
クエリ文字列にデータを含めずにリダイレクト中に2つのアクション間でデータを渡したい場合は、TempDataオブジェクトにモデルを配置します。
アクション
TempData["datacontainer"] = modelData;
見る
var modelData= TempData["datacontainer"] as ModelDataType;
TempDataは非常に短命のインスタンスであるため、現在および後続のリクエストでのみ使用する必要があります! TempDataはこのように機能するため、次のリクエストが何であるかを確実に知る必要があり、これを保証できるのは別のビューへのリダイレクトのみです。
したがって、TempDataの使用が確実に機能する唯一のシナリオは、リダイレクトするときです。
これを試して
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>");
ジェイソン・バンティングの答えを広げたい
このような
ActionResult action = new SampelController().Index(2, "text");
return action;
そして、Eliはそれをジェネリック変数にする方法についてのアイデアを求めてここに来ます
すべてのタイプのコントローラーを取得できます