none
ASP.NET MVCにて、Html.Partialで呼び出すページのViewBagが取得できない RRS feed

  • 質問

  • いつもお世話になっております。

    また初歩的な質問なのですが、これ以上自分で調べていると混迷を極めそうだったので、思い切って質問させていただきます。

    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は取得できません・・・きっと方法があると思うのですが、是非ご助言をいただけましたら幸いです。

    お手数おかけいたしますが、何卒よろしくお願いいたします。

    2014年6月8日 14:18

回答

  • > これでビルドすると、「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
    2014年6月9日 7:38

すべての返信

  • > これでビルドすると、「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
    2014年6月9日 7:38
  • >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 = "管理" })

    2014年6月9日 11:19