記事詳細


投稿日
2026年10月18日10時10分
タイトル

ASP.NET Core mvc:チャート用の「ViewBag.Labels」と「ViewBag.Data」をRedirectToPage("Home/Index")で利用出来ますか?

内容

結論として、ViewBag.Labels や ViewBag.Data は RedirectToPage("Home/Index") では利用できません。
理由は、ViewBag(および ViewData)は 同一 HTTP リクエスト内のみ有効で、リダイレクトすると新しいリクエストが発生し、値が破棄されるためです。

なぜ使えないのか

  • ViewBag / ViewData は Controller から View へデータを渡すための一時的な仕組み。
  • 内部的には ViewData(Dictionary)を利用しており、リクエスト終了とともに消える。
  • RedirectToPage や RedirectToAction は HTTP 302 などで新しいリクエストを発生させるため、前回の ViewBag の値は存在しない。

リダイレクト後にデータを渡す方法

1. TempData を利用(短期保持)

TempData はリダイレクトを跨いでも値を保持できるため、チャート用データの受け渡しに適しています。

Csharp
// Controller側 public IActionResult Chart() { TempData["Labels"] = new[] { "Jan", "Feb", "Mar" }; TempData["Data"] = new[] { 10, 20, 30 }; return RedirectToPage("/Home/Index"); }
Csharp
// Home/Index.cshtml @{ var labels = TempData["Labels"] as string[]; var data = TempData["Data"] as int[]; } <script> var chartLabels = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(labels)); var chartData = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(data)); </script>

2. クエリ文字列やルートパラメータで渡す

小規模データなら URL に埋め込む方法も可能です。

Csharp
return RedirectToPage("/Home/Index", new { labels = "Jan,Feb,Mar", data = "10,20,30" });

3. セッションを利用(長期保持)

複数ページや長期間保持する場合はセッションを使います。

Csharp
// 保存 HttpContext.Session.SetString("Labels", JsonSerializer.Serialize(new[] { "Jan", "Feb", "Mar" })); HttpContext.Session.SetString("Data", JsonSerializer.Serialize(new[] { 10, 20, 30 })); // 取得 var labels = JsonSerializer.Deserialize<string[]>(HttpContext.Session.GetString("Labels")); var data = JsonSerializer.Deserialize<int[]>(HttpContext.Session.GetString("Data"));

✅ まとめ

  • ViewBag はリダイレクト後には利用不可。
  • リダイレクト後に値を使いたい場合は TempData、クエリ文字列、セッションなどを利用する。
  • データ量が多い場合は DB に保存して再取得する方が安全。

もし必要であれば、TempData を使ってチャートデータを渡す ASP.NET Core MVC の完全動作サンプルを作成できます。
これを作成すれば、RedirectToPage 後でも確実にチャートが表示できます。

次はこの完全サンプルコードを作成しますか?


Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Controllers
編集 | 記事一覧