C# NETCore) ViewComponentを使ってnavbarにIDを表示する。

はじめに

.NETCoreで今回挑戦するのは、画面部品の作成です。
例えば、以下のようなことです。

  • ナビゲーションバーにユーザIDを表示する。
  • 各ページにサイドコンテンツを表示する。

Webページ作成では必須のことですね。

.NETCoreでは、ViewComponentを使うことで、これらを実現できます。

ASP.NET Core のビュー コンポーネント
ASP.NET Core でのビュー コンポーネントの使用方法とそれらをアプリに追加する方法を説明します。

それではさっそくViewComponentを使ってみましょう。

スポンサーリンク

ViewComponentの使い方

まず私が使用したプロジェクトについて、記載しておきます。

  • ASP.NET Core 3.0 Webアプリケーション(Razor)

今回は例として、ナビゲーションバーにユーザ名を表示できるようにしたいと思います。

完成すると以下のような感じになります。

未ログイン時
not_login-picture

 

ログイン時
logined-picture

「nky」というのは、ブログ執筆者の私のことです。

それではさっそく作っていきましょう。

フォルダ構成

画面部品(ViewComponent)を作っていきます。

以下のように、Componentsフォルダとファイルを作成します。

  • Components/部品名/部品名ViewComponent.cs
  • Components/部品名/Default.cshtml

folder-Picture

今回部品名は「UserId」としました。なので以下を追加しています。

  • 「Pages/Components/UserId/UserIdViewComponent.cs」
  • 「Pages/Components/UserId/Default.csthml」

ちなみに、フォルダパスやファイル名は重要です。適当に変な名前つけるとバグるので注意してください。

詳しくは公式を読むとわかると思います。

Microsoftはこういうところを規約で固めてる感あって、なんだか入りづらい感じがしますね。

ViewComponentの作成

「UserIdViewComponent.cs」ファイルの中身は以下です。

//UserIdViewComponent.cs
using Microsoft.AspNetCore.Mvc;
namespace razor.Pages.Components
{
  //ViewComponentを継承し、以下のどちらかを実装する
  //Invoke()       //同期
  //InvokeAsync()  //非同期
  public class UserIdViewComponent : ViewComponent
  {
    //Invoke()
    // ViewComponent読み込み時に実行される
    public IViewComponentResult Invoke()
    {
      //View()
      // Default.cshtmlを表示する
      return View(HttpContext.User);  //@modelを渡す
    }
  }
}

「Default.cshtml」の中身は以下です。

//Default.cshtml
@using System.Security.Claims;
@model ClaimsPrincipal
@{
  //ログイン中か
  if (Model.Identity.IsAuthenticated)
  { //ログイン中のとき、@Nameを表示する
    <a class="nav-link text-dark" asp-page="/">@Model.Identity.Name</a>
  }
  else
  { //ログイン中でないとき、「Login」を表示する
    <a asp-page="/Account/Login" class="nav-link">Login</a>
  }
}

これで画面部品であるViewComponentが完成しました。

こうしてみるとあっという間ですね。(すごい苦労したんですが、私がバグりまくってただけみたいです。)

ViewComponentの読み込み

次はViewComponentを読み込んでみます。

「Pages/Shared/_Layout.cshtml」のナビゲーションバーのところに以下の記述を追加してみましょう。

<li class="nav-item">
  @await Component.InvokeAsync("UserId")
</li>
@* 補足
 *  ViewComponentの読み込み
 *  Component.InvokeAsync()を使用してViewComponentを読み込む
 *  引数1:読み込むViewComponent
 *  "UserId"と指定すると、UserIdViewComponentクラスを読み込みに行く。
 *  自動でViewComponentが補われるので注意
 *@

これでナビゲーションバーに、未ログイン時はLoginリンクが、ログイン中はユーザ名が表示できるようになりました。

ViewComponentの使い方は、以上です。

これでWebページ制作に必須の画面部品の読み込みができるようになったと思います。

コメント

タイトルとURLをコピーしました