トップ回答者
ASP.NET MVCにて、Html.Partialで呼び出すページのViewBagが取得できない

質問
-
いつもお世話になっております。
また初歩的な質問なのですが、これ以上自分で調べていると混迷を極めそうだったので、思い切って質問させていただきます。
ASP.NET MVC5 アプリケーションにて、_LoginPartial.cshtml内でログイン時の表示名として、デフォルトの「User.Identity.GetUserName()」ではなく、独自に設定した表示名用フィールド「HandleName」をViewBagで取得しようとしたところ、思うようにいきません。
●SharedController.cs
public ActionResult _LoginPartial()
{
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var currentUser = manager.FindById(HttpContext.User.Identity.GetUserId());
ViewBag.handleName = currentUser.HandleName;
return PartialView();
}●_Layout.cshtml
@Html.Partial("_LoginPartial")
●_LoginPartial.cshtml
@Html.ActionLink("Hello " + (string)ViewBag.handleName + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "管理" })
これでビルドすると、「Hello !」とだけ表示されます。
ちなみに、index、About等他のActionResltメソッドへ同じ内容をreturn View();で記述してみると、該当ページでのみ「Hello 表示名!」ときっちり表示されることを確認いたしましたので、最悪、すべてのページのActionResltメソッドに同じ内容を書き込むと望みどおりの表示が得られます。
_Layout.cshtml側の引数とコントローラー側のreturnの引数をいじって_LoginPartial.cshtmlで@modelの記述をしてみて~等、試してみましたが何か足りないらしく、_LoginPartialのActionResultメソッドからのViewBagは取得できません・・・きっと方法があると思うのですが、是非ご助言をいただけましたら幸いです。
お手数おかけいたしますが、何卒よろしくお願いいたします。
回答
-
> これでビルドすると、「Hello !」とだけ表示されます。
@Html.Partial("_LoginPartial") ではコントローラーが呼ばれないので、ViewBag に何も入ってないからだと思います。
例えば、Home コントローラーに以下のようなアクションメソッドを作って、
public ActionResult LoginStatus() { ViewBag.handleName = "my handle name"; return PartialView("_LoginPartial"); }
_Layout.cshtml の Html.Partial を Html.Action に代えて上記のアクションメソッドを呼び出すようにすればうまく行くのではないかと思います。以下のような感じです。@Html.Action("LoginStatus", "Home")
- 回答としてマーク yufia 2014年6月9日 11:19
すべての返信
-
> これでビルドすると、「Hello !」とだけ表示されます。
@Html.Partial("_LoginPartial") ではコントローラーが呼ばれないので、ViewBag に何も入ってないからだと思います。
例えば、Home コントローラーに以下のようなアクションメソッドを作って、
public ActionResult LoginStatus() { ViewBag.handleName = "my handle name"; return PartialView("_LoginPartial"); }
_Layout.cshtml の Html.Partial を Html.Action に代えて上記のアクションメソッドを呼び出すようにすればうまく行くのではないかと思います。以下のような感じです。@Html.Action("LoginStatus", "Home")
- 回答としてマーク yufia 2014年6月9日 11:19
-
>SuferOnWww 様
ご回答ありがとうございました! 望んでた表記ができるようになりました。
ActionResultのメソッド名に当たるものをcshtml内で呼び出しさえすればコントローラーの記述も呼び出されるとばかり思っておりました。こうすればコントローラーを噛ませて部分表示させたいページを呼び出せるんですね・・・もっと勉強せねば。
最終的に以下のように提示していただいたコードをほぼそのまま使用して表記が実現いたしました。
とっても助かりました。どうもありがとうございました。
// HomeController.cs public ActionResult LoginStatus() { var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); var currentUser = manager.FindById(HttpContext.User.Identity.GetUserId()); // 未ログイン時のNullエラー防止 if (Request.IsAuthenticated) { ViewBag.handleName = currentUser.HandleName; } return PartialView("_LoginPartial"); } // _Layout.cshtml @Html.Action("LoginStatus", "Home") // _LoginPartial.cshtml @Html.ActionLink("Hello " + (string)ViewBag.handleName + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "管理" })