ASP.NET Core のコンポーネント タグ ヘルパー

コンポーネント タグ ヘルパーは、Razor Pages ページまたは MVC ビューで Razor コンポーネントをレンダリングします。

前提条件

mvc または Pages を使用した Integrate ASP.NET Core Razor コンポーネントRazorページまたはビューでのルーティング不可能なコンポーネントの使用に関する記事のガイダンスに従ってください。

構成に関するセクションのガイダンスに、次のいずれかにおいても従います。

  • Blazor Server: ルーティング可能なコンポーネントとルーティング不可能な Razor コンポーネントを Razor Pages および MVC アプリに統合します。
  • Blazor WebAssembly: ホストされた Razor ソリューションの Blazor WebAssembly コンポーネントを Razor Pages および MVC アプリに統合します。

MVC または Pages を使用した Integrate ASP.NET Core Razor コンポーネントの Razor セクションガイダンスに従ってください。

コンポーネント タグ ヘルパー

ページまたはビューからコンポーネントをレンダリングするには、コンポーネント タグ ヘルパー (<component> タグ) を使用します。

Razor アプリの Razor Pages および MVC アプリへのBlazor WebAssembly コンポーネントの統合は、.NET 5 以降の ASP.NET Core でサポートされています。

RenderMode によって、コンポーネントに対して以下の構成が行われます。

  • ページに事前レンダリングするかどうか。
  • ページに静的 HTML としてレンダリングするかどうか。または、ユーザー エージェントから Blazor アプリをブートストラップするために必要な情報が含まれているかどうか。

Blazor WebAssembly アプリの表示モードは、次の表のとおりです。

表示モード 説明
WebAssembly ブラウザーに読み込まれるときに対話型コンポーネントを含めるために使用される Blazor WebAssembly アプリ用のマーカーをレンダリングします。 コンポーネントはプリレンダリングされません。 このオプションを使用すると、異なる Blazor WebAssembly コンポーネントを異なるページにレンダリングしやすくなります。
WebAssemblyPrerendered コンポーネントを静的 HTML にプリレンダリングし、ブラウザーに読み込まれるときにコンポーネントを対話型にするために後で使用される Blazor WebAssembly アプリ用のマーカーを含めます。

表示モードは、次の表のとおりです。

表示モード 説明
ServerPrerendered コンポーネントを静的 HTML にレンダリングし、サーバー側の Blazor アプリのマーカーを含めます。 このマーカーは、ユーザー エージェントの起動時に Blazor アプリをブートストラップするために使用されます。
Server サーバー側の Blazor アプリのマーカーをレンダリングします。 コンポーネントからの出力は含まれません。 このマーカーは、ユーザー エージェントの起動時に Blazor アプリをブートストラップするために使用されます。
Static コンポーネントを静的 HTML にレンダリングします。

アプリの表示モードは、次の表のとおりです。

表示モード 説明
ServerPrerendered コンポーネントを静的 HTML にレンダリングし、サーバー側の Blazor アプリのマーカーを含めます。 このマーカーは、ユーザー エージェントの起動時に Blazor アプリをブートストラップするために使用されます。
Server サーバー側の Blazor アプリのマーカーをレンダリングします。 コンポーネントからの出力は含まれません。 このマーカーは、ユーザー エージェントの起動時に Blazor アプリをブートストラップするために使用されます。
Static コンポーネントを静的 HTML にレンダリングします。

その他の特性には、次などがあります。

  • 複数のコンポーネント タグ ヘルパーで、複数の Razor コンポーネントをレンダリングできます。
  • アプリの起動後に、コンポーネントを動的にレンダリングすることはできません。
  • ページとビューはコンポーネントを使用できますが、逆のことはできません。 ビューやページ固有の機能 (部分ビューや部分セクションなど) は、コンポーネントでは使用できません。 コンポーネントの部分ビューにあるロジックを使用するには、部分ビューのロジックを要素としてコンポーネントに取り入れます。
  • 静的 HTML ページからのサーバー コンポーネントのレンダリングはサポートされていません。

次のコンポーネント タグ ヘルパーでは、EmbeddedCounter を使用したサーバー側の Blazor アプリ内の、ServerPrerendered コンポーネントがページまたはビュー内でレンダリングされます。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using {APP ASSEMBLY}.Components

...

<component type="typeof(EmbeddedCounter)" render-mode="ServerPrerendered" />

前の例では、EmbeddedCounter コンポーネントがアプリの Components フォルダー内にあることを前提としています。 プレースホルダー {APP ASSEMBLY} は、アプリのアセンブリ名です (例: @using BlazorSample.Components)。

コンポーネント タグ ヘルパーでは、コンポーネントにパラメーターを渡すこともできます。 チェックボックス ラベルの色とサイズを設定する次の ColorfulCheckbox コンポーネントについて考えてみます。

Components/ColorfulCheckbox.razor:

<label style="font-size:@(Size)px;color:@Color">
    <input @bind="Value"
           id="survey" 
           name="blazor" 
           type="checkbox" />
    Enjoying Blazor?
</label>

@code {
    [Parameter]
    public bool Value { get; set; }

    [Parameter]
    public int Size { get; set; } = 8;

    [Parameter]
    public string? Color { get; set; }

    protected override void OnInitialized()
    {
        Size += 10;
    }
}

コンポーネント タグ ヘルパーでは、Size (int) と Color (string) コンポーネント パラメーターを設定できます。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using {APP ASSEMBLY}.Components

...

<component type="typeof(ColorfulCheckbox)" render-mode="ServerPrerendered" 
    param-Size="14" param-Color="@("blue")" />

前の例では、ColorfulCheckbox コンポーネントが Components フォルダー内にあることを前提としています。 プレースホルダー {APP ASSEMBLY} は、アプリのアセンブリ名です (例: @using BlazorSample.Components)。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using {APP ASSEMBLY}.Shared

...

<component type="typeof(EmbeddedCounter)" render-mode="ServerPrerendered" />

前の例では、EmbeddedCounter コンポーネントがアプリの Shared フォルダー内にあることを前提としています。 プレースホルダー {APP ASSEMBLY} はアプリのアセンブリ名です (たとえば、ホストされている @using BlazorSample.Shared ソリューションの @using BlazorSample.Client.Shared または Blazor)。

コンポーネント タグ ヘルパーでは、コンポーネントにパラメーターを渡すこともできます。 チェックボックス ラベルの色とサイズを設定する次の ColorfulCheckbox コンポーネントについて考えてみます。

Shared/ColorfulCheckbox.razor:

<label style="font-size:@(Size)px;color:@Color">
    <input @bind="Value"
           id="survey" 
           name="blazor" 
           type="checkbox" />
    Enjoying Blazor?
</label>

@code {
    [Parameter]
    public bool Value { get; set; }

    [Parameter]
    public int Size { get; set; } = 8;

    [Parameter]
    public string? Color { get; set; }

    protected override void OnInitialized()
    {
        Size += 10;
    }
}

コンポーネント タグ ヘルパーでは、Size (int) と Color (string) コンポーネント パラメーターを設定できます。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using {APP ASSEMBLY}.Shared

...

<component type="typeof(ColorfulCheckbox)" render-mode="ServerPrerendered" 
    param-Size="14" param-Color="@("blue")" />

前の例では、ColorfulCheckbox コンポーネントが Shared フォルダー内にあることを前提としています。 プレースホルダー {APP ASSEMBLY} は、アプリのアセンブリ名です (例: @using BlazorSample.Shared)。

次の HTML はページまたはビューにレンダリングされます。

<label style="font-size:24px;color:blue">
    <input id="survey" name="blazor" type="checkbox">
    Enjoying Blazor?
</label>

前の Razor の例のように、引用符で囲まれた文字列を渡すには、が必要です。 Razor 型である string 属性には、param-*object 型の値の解析動作は該当しません。

次の場合を除き、すべての種類のパラメーターがサポートされています。

  • ジェネリック パラメーター。
  • シリアル化できないパラメーター。
  • コレクション パラメーターの継承。
  • 型が Blazor WebAssembly アプリの外部で定義されているか、遅延読み込みされたアセンブリ内にあるパラメーター。
  • 子要素コンテンツの RenderFragment デリゲートを受信する場合 (たとえば、param-ChildContent="...")。 このシナリオでは、渡される子コンテンツを使用してレンダリングするコンポーネントを参照する Razor コンポーネント (.razor) を作成し、コンポーネント タグ ヘルパーのあるページまたはビューから Razor コンポーネントを呼び出すことをおすすめします。

パラメーターは、JSON のシリアル化可能な型である必要があります。これは通常、その型に既定のコンストラクターと設定できるプロパティがある必要があることを意味します。 たとえば、前の例の SizeColor には、SizeColor の型が JSON シリアライザーでサポートされているプリミティブ型 (intstring) であるため、値を指定することができます。

次の例では、クラス オブジェクトがコンポーネントに渡されます。

MyClass.cs:

public class MyClass
{
    public MyClass()
    {
    }

    public int MyInt { get; set; } = 999;
    public string MyString { get; set; } = "Initial value";
}

このクラスには、パラメーターなしのパブリック コンストラクターが含まれている必要があります。

Components/ParameterComponent.razor:

<h2>ParameterComponent</h2>

<p>Int: @MyObject?.MyInt</p>
<p>String: @MyObject?.MyString</p>

@code
{
    [Parameter]
    public MyClass? MyObject { get; set; }
}

Pages/MyPage.cshtml:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using {APP ASSEMBLY}
@using {APP ASSEMBLY}.Components

...

@{
    var myObject = new MyClass();
    myObject.MyInt = 7;
    myObject.MyString = "Set by MyPage";
}

<component type="typeof(ParameterComponent)" render-mode="ServerPrerendered" 
    param-MyObject="@myObject" />

前の例では、ParameterComponent コンポーネントがアプリの Components フォルダー内にあることを前提としています。 プレースホルダー {APP ASSEMBLY} は、アプリのアセンブリ名です (例: @using BlazorSample および @using BlazorSample.Components)。 MyClass は、アプリの名前空間にあります。

Shared/ParameterComponent.razor:

<h2>ParameterComponent</h2>

<p>Int: @MyObject?.MyInt</p>
<p>String: @MyObject?.MyString</p>

@code
{
    [Parameter]
    public MyClass? MyObject { get; set; }
}

Pages/MyPage.cshtml:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using {APP ASSEMBLY}
@using {APP ASSEMBLY}.Shared

...

@{
    var myObject = new MyClass();
    myObject.MyInt = 7;
    myObject.MyString = "Set by MyPage";
}

<component type="typeof(ParameterComponent)" render-mode="ServerPrerendered" 
    param-MyObject="@myObject" />

前の例では、ParameterComponent コンポーネントがアプリの Shared フォルダー内にあることを前提としています。 プレースホルダー {APP ASSEMBLY} は、アプリのアセンブリ名です (例: @using BlazorSample および @using BlazorSample.Shared)。 MyClass は、アプリの名前空間にあります。

その他のリソース