フォワードとリダイレクト
コントローラーからビューを呼び出して、画面を遷移する方法には、フォワードとリダイレクトの2種類あります。
フォワードは、内部的に処理する方法で、URLは変化しません。
リダイレクトは、他のURLにアクセスをやり直す方法で、URLが変化します。
ASP.NETのMVCモデルでは、フォワードは View()メソッド、リダイレクトは主に RedirectToAction()メソッドを使います。
View()メソッドや RedirectToAction()メソッドの詳しい内容は、以下のマイクロソフト公式サイトを参照してください。
View()メソッドの使い方
View()メソッドは、Viewsフォルダー配下にあるビューを呼び出し、画面を遷移させます。
View()メソッドを引数なしで呼び出すと、メソッド名に対応したビューが呼び出されます。
例えば、HomeController の Index()の場合は、Views/Homeフォルダー配下の Index.cshtml が呼び出されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class HomeController : Controller { public IActionResult Index() { return View(); } } } |
また、View()メソッドは、呼び出したいビューを引数として渡すことができます。
例えば、View("Index2")とすると、Views/Homeフォルダー配下の Index2.cshtml を呼び出すことができます。
View()メソッドは、同じコントローラーのビューのみを指定することができます。
ビュー名は、ダブルクォーテーション(")で囲む必要があります。
ViewDataを使ってビューに値を渡す
View()メソッドを使ってビューを呼び出した場合は、ViewData または ViewBag を使ってビューに値を渡すことができます。
なお、ViewData と ViewBag は同じ領域を使用しているため、例えば、ViewData["Value"] と ViewBag.Value は、同じ値になります。
以下の例では、コントローラー側で ViewData["Value"] に値を設定し、ビュー側で ViewData["Value"] と ViewBag.Value の値を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class HomeController : Controller { public IActionResult Index() { ViewData["Value"] = "フォワード"; return View(); } } } |
1 2 3 4 5 6 |
@{ ViewData["Title"] = "Index"; } <h2>@ViewData["Value"]</h2> <h2>@ViewBag.Value</h2> |
ビューはHTMLなので、C# のコードを使う場合は、先頭に「@」を付ける必要があります。
プログラムを実行すると、ViewData["Value"] で設定した値が、ViewBag.Value でも表示されていることが分かります。
RedirectToAction()メソッドの使い方
RedirectToAction()メソッドを使うと、他のコントローラーのメソッドを呼び出すことができます。
以下の例は、HomeController の Index()メソッドから WorkController の List()メソッドを呼び出します。
1 2 3 4 5 6 7 8 9 10 11 12 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class HomeController : Controller { public IActionResult Index() { return RedirectToAction("List", "Work"); } } } |
TempDataを使ってビューに値を渡す
RedirectToAction()メソッドを使ってビューを呼び出した場合は、TempData を使って値を渡すことができます。
RedirectToAction()メソッドを使った場合は、ViewData を使って値を渡すことはできません。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class HomeController : Controller { public IActionResult Index() { TempData["Value"] = "リダイレクト"; return RedirectToAction("List", "Work"); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class WorkController : Controller { public IActionResult List() { return View(); } } } |
1 2 3 4 5 |
@{ ViewData["Title"] = "List"; } <h2>@TempData["Value"]</h2> |
プログラムを実行すると、TempData["Value"] の値が表示されます。
また、URL も変わっていることが分かります。
ここで注意しないといけないのは、RedirectToAction()メソッドは該当のコントローラーを経由して、ビューを表示しているということです。
例えば、WorkController の List()メソッド内で ViewData に値を設定して、ビューに渡すこともできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class WorkController : Controller { public IActionResult List() { ViewData["Value"] = "WorkController"; return View(); } } } |
1 2 3 4 5 6 |
@{ ViewData["Title"] = "List"; } <h2>@TempData["Value"]</h2> <h2>@ViewData["Value"]</h2> |
プログラムを実行すると、HomeController の Index()メソッドで設定した TempData["Value"] と、WorkController の List()メソッドで設定した ViewData["Value"] の値が表示されます。
外部サイトにリダイレクトする
View()メソッドもRedirectToAction()メソッドもプロジェクト内のページを表示しましたが、Redirect()メソッドを使うと、URL を指定して外部のサイトを表示することができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
using Microsoft.AspNetCore.Mvc; namespace MvcApp1.Controllers { public class HomeController : Controller { public IActionResult Index() { return Redirect("https://learn.microsoft.com/ja-jp/"); } } } |
プログラムを実行すると、外部のサイトに遷移します。
Redirect()メソッドの詳しい内容は、以下のマイクロソフト公式サイトを参照してください。