チュートリアル: カスタム ロジックを使用したビュー コンポーネントの作成

Version: 22.x
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

大事な

September 2024より前にASP.NET Coreアプリを統合した場合は、従来の ASP.NET CoreレンダリングSDKバージョン22以前を使用しています。このSDKは更新プログラムを受け取らなくなったため、新しい ASP.NET Core SDKの最新バージョンにアップグレードすることをお勧めします。

ビュー コンポーネントを使用して、コンテンツをレンダリングし、ビュー モデルにデータを供給します。ビュー コンポーネントは、追加のレンダリング ロジックを実装するために使用できるC# クラスをサポートしているため、パーシャル ビューモデル バインド ビューよりも強力です。ASP.NET Coreビューコンポーネントに関するMicrosoftのドキュメントを参照してください。

従来のビュー コンポーネントは モデル バインディングをサポートしていませんが、Sitecore ASP.NET Rendering SDKSitecoreレイアウト サービス 出力へのモデル バインディングを提供します。

このチュートリアルでは、ASP.NETコア ビュー コンポーネントを使用してSitecoreコンテンツをレンダリングすると同時に、カスタム ロジックを追加してビュー モデルにデータを追加する方法を示します。

メモ

このチュートリアルでは、次の方法について説明します。

  • My Serviceテンプレートを作成します。

  • MyService JSONレンダリングを作成します。

  • MyService JSONレンダリングのMainプレースホルダを設定します。

  • MyProjectサイトを公開します。

  • MyService JSONレンダリングをMyProject/Homeページに追加します。

  • IFakeServiceサービス インターフェイスを作成します。

  • FakeServiceサービス・クラスを作成します。

  • FakeServiceサービスをStartupクラスに登録します。

  • MyServiceModelモデルを作成します。

  • MyServiceViewComponentビュー・コンポーネント・クラスを作成します。

  • MyService/Default Razorビューを作成します。

  • MyServiceViewComponentビュー・コンポーネントをStartupクラスに登録します。

  • MyServiceデータ ソースにコンテンツを追加します。

My Serviceテンプレートを作成する

My Serviceテンプレートは、MyServiceデータ ソースのヘッダー テキスト フィールドのセットを定義します。

My Serviceテンプレートを作成するには:

  1. コンテンツ エディタで、/sitecore/Templates/Project/MyProjectフォルダを右クリックし、InsertNew Templateの順にクリックします。

  2. Select nameダイアログのNameフィールドにMy Serviceと入力し、Nextをクリックします。

  3. Locationダイアログで、選択したパスにテンプレートが作成されていることを確認し、「Next」と「Close」をクリックします。コンテンツ エディターでMy Serviceテンプレートが自動的に開きます。

  4. My ServiceテンプレートのBuilderタブで、My Service Template Fieldsという名前のセクションと2つのフィールドを作成します。

    • DateHeader (1行テキスト)

    • ValueHeader (1行テキスト)

  5. My Serviceテンプレートを保存します。

MyService JSONレンダリングを作成する

MyService JSONレンダリングでは、My Serviceテンプレートに基づいて任意のデータ ソースのコンテンツをレンダリングできます。

MyService JSONレンダリングを作成するには:

  1. コンテンツ エディタで、/sitecore/Layout/Renderings/Project/MyProjectフォルダを右クリックし、InsertJson Renderingの順にクリックします。

  2. Messageダイアログで、「MyService」と入力し、「OK」をクリックします。コンテンツ エディタで、MyService JSONレンダリングが自動的に開きます。

  3. MyService JSONレンダリングのContentタブのEditor Optionsセクションで、次のフィールドを構成します。

    • Datasource Locationフィールドに ./と入力します。

    • Datasource TemplateフィールドでInsert linkをクリックし、Insert Itemダイアログで/templates/Project/MyProject/My Serviceを選択してInsertをクリックします。

  4. MyService JSONレンダリングを保存します。

MyService JSONレンダリングのMainプレースホルダーを構成する

Mainプレースホルダーは、設定したレンダリングのみを受け入れます。

MyService JSONレンダリングのMainプレースホルダを設定するには:

  1. コンテンツ エディターで、/sitecore/Layout/Placeholder Settings/Project/MyProject/Mainプレースホルダー アイテムに移動します。

  2. MainプレースホルダーのContentタブのDataセクションのAllowed ControlsフィールドでEditをクリックします。

  3. Select Itemsダイアログの「Editors」タブの「All」ペインで、「Layout/Renderings/Project/MyProject/MyService」をクリックし、青い矢印をクリックして、MyService JSONレンダリングを「Selected」ペインにコピーします。次に、「OK」をクリックします。

  4. Mainプレースホルダーを保存します。

MyProjectサイトを公開する

MyProjectサイトを公開するには:

  1. コンテンツ エディタで、sitecore/Content/MyProject/Homeに移動します。

  2. Publishタブで、「Publish site」をクリックします。

  3. Publish Siteダイアログで、「Republish」チェックボックスを選択し、「OK」をクリックします。

MyService JSONレンダリングをMyProject/Homeページに追加する

MyProject/HomeページのMainプレースホルダーにMyService JSONレンダリングを追加し、MyServiceデータソースを作成してから、ページをパブリッシュしてレンダリング ホスト ログで出力を確認する必要があります。

MyService JSONレンダリングをMyProject/Homeページに追加するには、次のようにします。

  1. エクスペリエンス エディターで、MyProject/Homeページに移動します。

  2. HomeタブでComponentをクリックし、Mainプレースホルダにレンダリングを追加できるAdd hereハンドラの1つをクリックします。

  3. Select a Renderingダイアログで、「My Service」をクリックしてSelect

  4. Select the Associated Contentダイアログの「Create New Content」タブの「Name」フィールドに「MyService data source」と入力し、「OK」をクリックします。

    手記

    StartupクラスにMyServiceViewComponentを登録するまで、Unknown component 'MyService'メッセージが表示されます。

  5. MyProject/Homeページを保存します。

  6. Homeタブで、「Publish」をクリックします。

  7. Publish Itemダイアログで、「Smart publish」および「Publish related items」チェックボックスを選択し、「Publish」をクリックします。

  8. レンダリング ホストにアクセスし、MyService JSONレンダリングでUnknown Component 'MyService'が出力されることを確認します。

  9. レンダリング ホスト ログで、Sitecoreレイアウト サービスの応答にMyServiceデータ ソースIDと空白のヘッダー テキストを含むMyServiceコンポーネントが表示されていることを確認します。

    RequestResponse
    {
      "uid": "efe02844-bd57-4d31-be93-384440aa8d0c",
      "componentName": "MyService",
      "dataSource": "{79F7E3DF-DD72-4575-AFB7-64E174AC6401}",
      "params": {},
      "fields": {
        "DateHeader": {
          "value": ""
        },
        "ValueHeader": {
          "value": ""
        }
      }
    }

IFakeServiceサービス インターフェイスを作成する

IFakeServiceサービス インターフェイスは、FakeService実装に含める必要があるものを定義します。顧客ソリューションでは、これを実際のビジネス ロジックを含むサービスに置き換えます。

FakeServiceインターフェースを作成するには:

  1. Visual Studioで管理者特権を持つソリューション エクスプローラーで、RenderingHostプロジェクトを右クリックし、AddNew Folderの順にクリックします。フォルダにServicesという名前を付けます。

  2. RenderingHost/Servicesフォルダを右クリックし、AddNew Itemの順にクリックします。

  3. Add New Itemダイアログで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C#/ASP.NET Core/Codeをクリックします。

    • 中央のウィンドウで、Interfaceをクリックします。

    • ダイアログの下部にあるNameフィールドにIFakeService.csと入力し、Addをクリックします。

  4. IFakeService.csファイルで、内容を次のコードで置き換えます。

    RequestResponse
    using System;
    using System.Threading.Tasks;
    namespace MyProject.Services
    {
        public interface IFakeService
        {
            DateTime FakeDate { get; }
            Task<int> GetFakeValueAsync();
        }
    }
  5. IFakeService.csファイルを保存します。

FakeServiceサービス・クラスを作成する

FakeServiceサービス・クラスは、MyServiceViewComponent・クラスの日付と値を、MyService・データ・ソース・ヘッダー・テキストの下に表示するようにします。

FakeServiceサービス・クラスを作成するには、次のようにします。

  1. Visual Studioのソリューション エクスプローラーで、RenderingHost/Servicesフォルダーを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemダイアログで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C#/ASP.NET Core/Codeをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • ダイアログの下部にあるNameフィールドにFakeService.csと入力し、Addをクリックします。

  3. FakeService.csファイルで、内容を次のコードで置き換えます。

    RequestResponse
    using System;
    using System.Threading.Tasks;
    namespace MyProject.Services
    {
        public class FakeService : IFakeService
        {
            public DateTime FakeDate => DateTime.Now;
            public async Task<int> GetFakeValueAsync()
            {
                return await Task.Run(() => new Random().Next());
            }
        }
    }
    
  4. FakeService.csファイルを保存します。

FakeServiceサービスをStartupクラスに登録します

FakeServiceはサービスであるため、Startupクラスに登録する必要があります。

FakeServiceサービスをStartupクラスに登録するには、次のようにします。

  1. Visual Studioのソリューション エクスプローラーのRenderingHostプロジェクトで、Startup.csファイルをダブルクリックします。

  2. Startup.csファイルに、MyProject.Services名前空間を追加します。

    RequestResponse
    using MyProject.Services;
  3. StartupクラスのConfigureServicesメソッドで、次のFakeServiceを追加します。

    RequestResponse
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddTransient<IFakeService, FakeService>();
    }
  4. Startup.csファイルを保存します。

MyServiceModelモデルの作成

MyServiceViewComponentビュー コンポーネント クラスは、MyServiceデータ ソース ヘッダー テキストと、MyServiceModelモデルのFakeServiceサービス日付および値フィールドを組み合わせます。

MyServiceModelモデルを作成するには:

  1. Visual Studioのソリューション エクスプローラーで、RenderingHost/Modelsを右クリックし、AddNew Itemの順にクリックします。

  2. Add New Itemダイアログで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C#/ASP.NET Core/Codeをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • ダイアログの下部にあるNameフィールドにMyServiceModel.csと入力し、Addをクリックします。

  3. MyServiceModel.csファイルで、内容を次のコードで置き換えます。

    RequestResponse
    using System;
    using Sitecore.AspNet.RenderingEngine.Binding.Attributes;
    using Sitecore.LayoutService.Client.Response.Model.Fields;
    namespace MyProject.Models
    {
        public class MyServiceModel
        {
            public TextField DateHeader { get; set; }
            public TextField ValueHeader { get; set; }
            public DateTime ServiceDate { get; set; }
            public int ServiceValue { get; set; }
            [SitecoreContextProperty]
            public bool IsEditing { get; set; }
        }
    }
    

    DateHeaderプロパティとValueHeaderプロパティはIFieldから継承され、Sitecoreレイアウト サービスの応答に自動的にバインドされます。このようにして、MyServiceデータソースヘッダーテキストが入力されます。

    ServiceDateプロパティとServiceValueプロパティは、FakeServiceMyServiceViewComponentクラスによって設定されます。

    IsEditingプロパティは、SitecoreContextProperty属性でSitecoreContextにバインドされます。

  4. MyServiceModel.csファイルを保存します。

MyServiceViewComponentビュー コンポーネント クラスを作成します

MyService JSONレンダリング、FakeServiceサービス、およびMyServiceModelモデルを作成したので、このチュートリアルの中心となるMyServiceViewComponentクラスを作成できます。

MyServiceViewComponentクラスでは、FakeServiceサービス コンテンツがMyServiceModelモデル コンテンツに追加され、MyService/Defaultビューに表示されます。ここでは、任意のカスタムロジックを追加または呼び出すことができます。

MyServiceViewComponentクラスを作成するには、次のようにします。

  1. Visual Studioのソリューション エクスプローラーで、RenderingHostプロジェクトを右クリックし、AddNew Folderの順にクリックします。フォルダにViewComponentsという名前を付けます。

  2. RenderingHost/ViewComponentsフォルダを右クリックし、AddNew Itemの順にクリックします。

  3. Add New Itemダイアログで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C#/ASP.NET Core/Codeをクリックします。

    • 中央のウィンドウで、Classをクリックします。

    • ダイアログの下部にあるNameフィールドにMyServiceViewComponent.csと入力し、Addをクリックします。

  4. MyServiceViewComponent.csファイルで、内容を次のコードで置き換えます。

    RequestResponse
    using System;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using MyProject.Models;
    using MyProject.Services;
    using Sitecore.AspNet.RenderingEngine.Binding;
    namespace MyProject.ViewComponents
    {
        public class MyServiceViewComponent : ViewComponent
        {
            private readonly IViewModelBinder modelBinder;
            private readonly IFakeService fakeService;
    
            // Use the view component support for dependency injection to inject
            // FakeService and the
            // Sitecore.AspNet.RenderingEngine.Binding.IViewModelBinder service.
            public MyServiceViewComponent(IViewModelBinder modelBinder, IFakeService fakeService)
            {
                this.modelBinder = modelBinder;
                this.fakeService = fakeService;
            }
    
            public async Task<IViewComponentResult> InvokeAsync()
            {
                // Bind MyServiceModel to the Sitecore Layout Service response
                // when the view component is invoked.
                var model = await modelBinder.Bind<MyServiceModel>(this.ViewContext);
    
                if (model.IsEditing)
                {
                    // Set mock values to be displayed in edit mode only.
                    // This avoids invoking FakeService in the Experience Editor and
                    // can be very helpful for content authors, especially if
                    // FakeService requires authentication or the user values are
                    // not available in edit mode.
                    model.ServiceDate = DateTime.MinValue;
                    model.ServiceValue = 42;
                }
                else
                {
                    // Invoke FakeService to populate the date and value of the model.
                    var serviceResult = await fakeService.GetFakeValueAsync();
                    model.ServiceDate = fakeService.FakeDate;
                    model.ServiceValue = serviceResult;
                }
    
                // Return the model to the Default.cshtml Razor view.
                return View(model);
            }
        }
    }
  5. MyServiceViewComponent.csファイルを保存します。

MyService/Default Razorビューを作成する

MyService/Default RazorビューはMyServiceModelモデルにバインドされ、ページ上にコンテンツが表示されます。

MyService/Defaultビューを作成するには:

  1. Visual Studioのソリューション エクスプローラーで、RenderingHost/Views/Shared/Componentsフォルダーを右クリックし、AddNew Folderの順にクリックします。フォルダにMyServiceという名前を付けます。

    手記

    MyServiceフォルダ名は、MyServiceViewComponentクラス名と一致する必要がありますが、ViewComponentサフィックスは付きません。これは、Visual StudioがViews/Shared/Components/MyService/DefaultビューをViewComponents/MyServiceViewComponentクラスに接続する方法です。

  2. RenderingHost/Views/Shared/Components/MyServiceフォルダを右クリックし、AddNew Itemの順にクリックします。

  3. Add New Itemダイアログで、次の操作を行います。

    • 左側のウィンドウで、Installed/Visual C#/ASP.NET Core/Webをクリックします。

    • 中央のウィンドウで、Razor View - Emptyをクリックします。

    • ダイアログの下部にあるNameフィールドにDefault.cshtmlと入力し、Addをクリックします。

  4. Default.cshtmlファイルで、内容を次のコードで置き換えます。

    RequestResponse
    @model MyProject.Models.MyServiceModel
    <h2 asp-for="DateHeader"></h2>
    @Model.ServiceDate.ToString("R")
    <h2 asp-for="ValueHeader"></h2>
    @Model.ServiceValue
  5. Default.cshtmlファイルを保存します。

MyServiceViewComponentビューコンポーネントをStartupクラスに登録します

WebページでMyServiceViewComponentビュー コンポーネントを使用するには、Startupクラスに登録する必要があります。

MyServiceViewComponentビュー コンポーネントをStartupクラスに登録するには、次のようにします。

  1. Visual Studioのソリューション エクスプローラーのRenderingHostプロジェクトで、Startup.csファイルをダブルクリックします。

  2. Startup.csファイル、Startupクラス、ConfigureServicesメソッド、AddSitecoreRenderingEngineサービス登録で、MyServiceビューコンポーネントオプションを追加します。

    RequestResponse
    services.AddSitecoreRenderingEngine(options =>
    {
      options
        .AddModelBoundView<ContentBlockModel>("ContentBlock")
        .AddViewComponent("MyService")
        .AddDefaultPartialView("_ComponentNotFound");
    })
    手記

    AddViewComponentパラメーターは、MyServiceViewComponentの名前と一致する必要がありますが、ViewComponentサフィックスは使用しないでください。

  3. Startup.csファイルを保存します。

エクスペリエンス エディターとレンダリング ホストでMyProject/Homeページを開くと、MyServiceViewComponentビュー コンポーネントの出力を確認できます。レンダリング ホスト ログでエラーを確認することをお勧めします。

Illustration showing the Experience Editor with the MyServiceViewComponent view component.
Illustration showing the rendering host with the MyServiceViewComponent view component.

左のスクリーンショットは、エクスペリエンス エディターとMyServiceViewComponentビュー コンポーネントを示しています。 No text in fieldヘッダーは、MyServiceデータソースヘッダーのテキストプロパティがまだ設定されていないことを示しています。日付と数字42FakeServiceサービスが編集モードでモック値を表示することを確認します。

右のスクリーンショットは、MyServiceViewComponentビュー コンポーネントを使用したレンダリング ホストを示しています。空のMyServiceデータソースヘッダーのテキストプロパティは表示されず、日付と乱数は、FakeServiceサービスがライブモードでライブ値を表示することを確認します。

MyServiceデータ ソースにコンテンツを追加する

レンダリング ホスト ページでヘッダー テキストを取得するには、エクスペリエンス エディターを使用して、MyServiceデータ ソースにコンテンツを追加します。

MyServiceデータソースにコンテンツを追加するには:

  1. エクスペリエンス エディターで、MyProject/Homeページに移動します。

  2. 独自のヘッダーテキスト値をMyServiceデータソースに挿入するには、「 No text in field」をクリックします。

  3. MyProject/Homeページを保存します。

  4. Homeタブで、「Publish」をクリックします。

  5. Publish Itemダイアログで、「Smart publish」および「Publish related items」チェックボックスを選択し、「Publish」をクリックします。

  6. レンダリング ホストにアクセスして、ヘッダー テキスト値と共にMyServiceViewComponentビュー コンポーネントが表示されていることを確認します。

    Illustration showing the rendering host page with the MyServiceViewComponent view component and header texts.
先端

何かフィードバックはありますか?

この記事を改善するための提案がある場合は、