結論として、ViewBag.Labels や ViewBag.Data は RedirectToPage("Home/Index") では利用できません。
理由は、ViewBag(および ViewData)は 同一 HTTP リクエスト内のみ有効で、リダイレクトすると新しいリクエストが発生し、値が破棄されるためです。
なぜ使えないのか
- ViewBag / ViewData は Controller から View へデータを渡すための一時的な仕組み。
- 内部的には
ViewData(Dictionary)を利用しており、リクエスト終了とともに消える。 RedirectToPage や RedirectToAction は HTTP 302 などで新しいリクエストを発生させるため、前回の ViewBag の値は存在しない。
リダイレクト後にデータを渡す方法
1. TempData を利用(短期保持)
TempData はリダイレクトを跨いでも値を保持できるため、チャート用データの受け渡しに適しています。
// Controller側
public IActionResult Chart()
{
TempData["Labels"] = new[] { "Jan", "Feb", "Mar" };
TempData["Data"] = new[] { 10, 20, 30 };
return RedirectToPage("/Home/Index");
}
// 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 に埋め込む方法も可能です。
return RedirectToPage("/Home/Index", new { labels = "Jan,Feb,Mar", data = "10,20,30" });
3. セッションを利用(長期保持)
複数ページや長期間保持する場合はセッションを使います。
// 保存
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 後でも確実にチャートが表示できます。
次はこの完全サンプルコードを作成しますか?