web-dev-qa-db-ja.com

ASP.NET MVC:MVCのページ/アクションにリダイレクトする正しい方法は何ですか?

私はMVCにはかなり新しいですが、どのリダイレクト...がWebFormsで使用されている標準リダイレクト、つまり標準のResponse.Redirect()を置き換えるのか正確にはわかりません

たとえば、いくつかのシナリオで他のページにリダイレクトする必要があります。

1)ユーザーがログアウトするとき(アクションのフォームサインアウト)ログインページにリダイレクトしたい。

2)Initializeなどのコントローラーまたはベースコントローラーイベントで、別のページにリダイレクトしたい(AbsoluteRootUrl + Controller + Action)

場合によっては複数のリダイレクトが呼び出され、エラーが発生するようです。これは、ページがすでにリダイレクトされているという事実と関係がありますか?現在のリクエストをキャンセルしてリダイレクトする方法は?

更新:

この質問に対する答え( System.Web.Mvc.Controller Initialize )は、Initializeを使用してはならず、OnActionExecutingを使用する必要があることを示していますか?

Initializeを使用すべきでない理由、またはOnAuthorizationが優れたオプションではない理由に関するコメントはありますか?

詳細:

このブログ投稿( http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/ )は、OnActionExecutingが認証に有用であることを示しています(上記のリンクに示されています)これをベースコントローラークラスのイベントに追加すると、すべてのページがMVCでアクションを実行するので問題ありませんので、大きな違いはなく、リダイレクトする機能が簡単になるはずです。これは理にかなっていますが、このイベントの前にイベントで何かを行うことができ、それらのイベントが何のためにあるのか疑問に思うことも私には理にかなっています。 OnActionExecutingを試してみます。

28
Mark Redman

1)ユーザーがログアウトしたとき(アクションでフォームサインアウト)ログインページにリダイレクトしたい。

public ActionResult Logout() {
    //log out the user
    return RedirectToAction("Login");
}

2)イニシャライズなどのコントローラーまたはベースコントローラーイベントで、別のページにリダイレクトしたい(AbsoluteRootUrl + Controller + Action)

コントローラーの初期化からリダイレクトしたいのはなぜですか?

ルーティングエンジンは、着信したリクエストを自動的に処理します。コントローラーのインデックスアクションからリダイレクトする場合は、次のようにします。

public ActionResult Index() {
    return RedirectToAction("whateverAction", "whateverController");
}
24
Jimmy

1)ログインページ/ログインページからリダイレクトするには、Redirect()メソッドを使用しないでください。 FormsAuthentication.RedirectToLoginPage()FormsAuthentication.RedirectFromLoginPage()を使用してください!

2)通常のシナリオではRedirectToAction( "action"、 "controller")を使用するだけです。Initializeメソッドの内側にリダイレクトしたいですか?どうして?なぜあなたはこれをしたいのかわかりません。ほとんどの場合、あなたはあなたのアプローチを確認する必要があります。代わりに、コントローラーまたはメソッドの[Authorize]属性:)

PD: Initialiseメソッドにセキュリティチェックがあり、ユーザーがこのメソッドにアクセスできない場合、いくつかのことができます:a)

Response.StatusCode = 403;
Response.End();

これにより、ユーザーはログインページに戻ります。彼をカスタムの場所に送りたい場合は、次のようなことができます(cautios:pseudocode)

Response.Redirect(Url.Action("action", "controller"));

完全なURLを指定する必要はありません。これで十分でしょう。完全なURLを完全に主張する場合:

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString());
5
Artiom Chilaru
RedirectToAction("actionName", "controllerName");

他のオーバーロードもありますので、チェックしてください!

また、新規で T4MVC を使用していない場合は、使用することをお勧めします。

アクション、コントローラー、ビューなどのインテリジェンスを提供します(マジックストリングは不要です)

2
Mahesh Velaga