web-dev-qa-db-ja.com

ASP.NET MVCでは、response.redirectはどのように機能しますか?

私は、従来のASPおよびASP.NET Webフォームでresponse.redirectを使用しました。しかし、MVC 2.0では、何か奇妙なことに遭遇しています。

いくつかの情報の読み込みと検証に役立つ複数のコントローラーメソッドで使用されるコントローラークラスにプライベートメソッドがあります。このプライベートメソッドは、問題が一般的なエラーメッセージページに発見された場合にリダイレクトするように設定されています。

私が気づいている大きな問題は、呼び出し元のコントローラークラスとページビューが、リダイレクトが実際に行われる前にレンダリングとロードを完了しようとすることです。ジェネリックエラーページが最終的に読み込まれる前に、Viewが無視する必要がある例外をスローするため、これは開発では面倒です。

前述のように、古いページのresponse.redirectに慣れているため、新しいページが読み込まれると、ページ上の後続のコードが実行されません。

MVCでのリダイレクトに関するヘルプやアドバイスは大歓迎です。

29
Swoop

ASP.Net MVCでリダイレクトする従来のメカニズムは、RedirectResult型のオブジェクトをクライアントに返すことです。 Viewメソッドが呼び出される前にこれが行われた場合、Viewメソッドは呼び出されません。

Response.Redirectを自分で呼び出す場合、Asp.Net MVCのフロントコントローラーに代わりに実行させるのではなく、コントローラーメソッドは終了するか例外をスローするまで続行されます。

あなたの問題に対する慣用的な解決策は、プライベートメソッドがコントローラーが使用できる結果を返すようにすることです。

例えば:

public ActionResult Edit(MyEntity entity)
{
  if (!IsValid()) return Redirect("/oops/");
  ...
  return View();

}

private bool IsValid()
{
  if (Nozzle==NozzleState.Closed) return false;
  if (!hoseAttached) return false;
  return (userRole==Role.Gardener);
}
46
JasonTrue

ASP.NET MVCでは、通常、コントローラーメソッドからRedirectResultを返すことで別のページにリダイレクトします。

例:

public ActionResult Details(int id)
{
     // Attempt to get record from database
     var details = dataContext.GetDetails(id);

     // Does requested record exist?
     if (details == null)
     {
         // Does not exist - display index so user can choose
         return RedirectToAction("Index");
     }

     // Display details as usual
     return View(details);
}
20
Robert Harvey

MVCではResponse.Redirectを使用しない

return RedirectToAction("ActionResultName", "ControllerName");

[〜#〜] why [〜#〜]に関して、MVCでResponse.Redirectを使用しない場合:

  1. パフォーマンスの問題
  2. 特にMVC向けに構築された標準のasp.net MVCパターンおよび規則に従っていません。
10
Tom Stickel

推奨され、それを使用してmvcコントローラーアクションでasp.netフォームにリダイレクトする唯一の方法

return Redirect("/page/pagename.aspx");

他の方法を使用してリダイレクトすることができます(推奨されない悪い方法)

Response.Redirect("/page/pagename.aspx", true);

リダイレクトには機能しますが、問題はセッションの値をすべてクリアすることです。推奨されない理由.

2
adnan