ASP.NET Core Blazor の基礎
メモ
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
警告
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
重要
この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
"基礎" に関する記事では、Blazor の基本概念に関するガイダンスを提供します。 いくつかの概念は "Razor コンポーネント" の基本的な理解に結び付いており、それについてはこの記事の次のセクションおよび "コンポーネント" に関する記事で詳しく説明します。
静的および対話型のレンダリングの概念
Razor コンポーネントは静的にレンダリングされるか、対話形式でレンダリングされます。
静的、または静的レンダリングは、ユーザーと .NET/C# コード間の相互作用の容量なしでコンポーネントがレンダリングされることを意味するサーバー側のシナリオです。 JavaScript イベントと HTML DOM イベントは影響を受けませんが、クライアント上のユーザー イベントはサーバー上で実行されている .NET で処理できません。
対話型 または 対話型のレンダリング は、コンポーネントが C# コードを介して .NET イベントを処理する容量を持っていることを意味します。 .NET イベントは、ASP.NET Core ランタイムによってサーバー上で処理されるか、WebAssembly ベースの Blazor ランタイムによってクライアント上のブラウザーで処理されます。
重要
Blazor Web App を使用する場合、Blazor ドキュメントのほとんどのサンプル コンポーネントを機能させ、記事で説明されている概念を実証するには、インタラクティビティが必要です。 記事で提供されるコンポーネントの例をテストする場合は、アプリがグローバルなインタラクティビティを採用しているか、またはコンポーネントが対話型レンダリング モードを採用していることを確認してください。
これらの概念と、静的レンダリングと対話型レンダリングを制御する方法の詳細は、Blazor ドキュメントの後半にある「ASP.NET Core Blazor レンダリング モード」の記事に記載されています。
クライアントとサーバーのレンダリングの概念
Blazor ドキュメント全体を通じて、ユーザーのシステムで行われるアクティビティは、クライアント上で、またはクライアント側で発生すると言われます。 サーバー上で行われるアクティビティは、サーバー上またはサーバー側で発生すると言われます。
レンダリングという用語は、ブラウザーが表示する HTML マークアップを生成することを意味します。
クライアント側レンダリング (CSR) は、最終的な HTML マークアップがクライアント上の .NET WebAssembly ランタイムによって生成されることを意味します。 アプリのクライアントによって生成された UI の HTML は、この種類のレンダリングのためにサーバーからクライアントに送信されません。 ユーザーとページのやりとりが想定されます。 "静的" なクライアント側のレンダリングという概念はありません。 CSR は対話型と見なされるため、""対話型" クライアント側レンダリング" と ""対話型" CSR" は業界や Blazor のドキュメントでは使用されません。
サーバー側のレンダリング (SSR) は、最終的な HTML マークアップがサーバー上の ASP.NET Core ランタイムによって生成されることを意味します。 HTML は、ネットワーク経由でクライアントに送られて、そのクライアントのブラウザで表示されます。 この種類のレンダリング用に、クライアントによってアプリのサーバーによって生成された UI の HTML は作成されません。 SSR には、次の 2 種類があります。
- 静的 SSR: サーバーでは、ユーザー インタラクティビティや Razor コンポーネントの状態の保持を提供しない静的 HTML を生成します。
- 対話型 SSR: Blazor イベントによってユーザー インタラクティビティが許可され、Razor コンポーネントの状態は Blazor フレームワークによって保持されます。
プリレンダリングは、レンダリングされたコントロールのイベント ハンドラーを有効にせずに、最初にサーバーにページ コンテンツをレンダリングするプロセスです。 サーバーは、最初の要求に応じてできるだけ早くページの HTML UI を出力します。これにより、アプリはユーザーに対してより応答性が高くなります。 プリレンダリングでは、検索エンジンがページ ランクの計算に使用する初期 HTTP 応答のコンテンツをレンダリングすることで、検索エンジンの最適化 (SEO) を向上させることもできます。 プリレンダリングの後には、常にサーバーまたはクライアント上の最終レンダリングが続きます。
Razor のコンポーネント
Blazor アプリは "Razor コンポーネント" が基になっており、単に "コンポーネント" と呼ばれることがよくあります。 "コンポーネント" とは、ページ、ダイアログ、データ入力フォームといった UI の要素です。 コンポーネントは、.NET アセンブリに組み込まれている .NET C# クラスです。
Razor は、クライアント側の UI ロジックと構成用に Razor マークアップ ページの形式でコンポーネントが通常記述される方法を示しています。 Razor とは、開発者の生産性のために設計された、C# コードに HTML マークアップを結合するための構文です。 Razor ファイルでは、.razor
ファイル拡張子が使われます。
"Blazor コンポーネント" という用語を使用する Blazor 開発者やオンライン リソースもありますが、このドキュメントではそれは使わず、一貫して "Razor コンポーネント" または "コンポーネント" を使います。
Blazor のドキュメントでは、コンポーネントを示したり説明したりするためにいくつかの規則が使われています。
- 一般に、例は ASP.NET Core と C# のコーディング規則およびエンジニアリング ガイドラインに従っています。 詳細については次のリソースをご覧ください。
- プロジェクトのコード、ファイルのパスと名前、プロジェクト テンプレート名、その他の特殊な用語は、英語 (米国) で表記され、通常は code で囲まれています。
- コンポーネントは、通常、C# のクラス名 (パスカル ケース) の後に "コンポーネント" を付けて参照されます。たとえば、一般的なファイル アップロード コンポーネントは "
FileUpload
コンポーネント" と呼ばれます。 - 通常、コンポーネントの C# クラス名は、そのファイル名と同じです。
- 通常、ルーティング可能なコンポーネントの相対 URL は、コンポーネントのクラス名のケバブ ケース (ハイフンでつないだもの) に設定されます。 たとえば、
FileUpload
コンポーネントに含まれるルーティング構成では、レンダリングされるコンポーネントに到達するために/file-upload
という相対 URL が使われます。 ルーティングとナビゲーションについては「ASP.NET Core の Blazor ルーティングとナビゲーション」をご覧ください。 - コンポーネントの複数のバージョンが使われている場合は、順番に番号が付けられます。 たとえば、
FileUpload3
コンポーネントは/file-upload-3
で到達されます。 - コンポーネント定義 (
.razor file
) の先頭にある Razor ディレクティブは、@page
、@rendermode
(.NET 8 以降)、@using
ステートメント、その他のディレクティブの順序でアルファベット順に配置されます。 private
メンバーには必要ありませんが、記事の例とサンプル アプリではアクセス修飾子が使用されています。 たとえば、maxAllowedFiles
という名前のフィールドを宣言するには、private
をprivate int maxAllowedFiles = 3;
のように記述します。- コンポーネント パラメータ の値は、Razor 予約
@
記号で始まりますが、これは必須ではありません。 コンポーネント パラメータ値としてのリテラル (ブール値など)、キーワード (this
など)、null
に@
のプレフィックスは付けられていませんが、これも単なるドキュメント規則です。 ご自身のコードでは、必要に応じてリテラルに@
のプレフィックスを付けることができます。 - C# クラスでは、
this
キーワードを使用し、コンストラクターで割り当てられているアンダースコア (_
) でフィールドのプレフィックスを付けないようにします。これは、ASP.NET Core フレームワーク エンジニアリング ガイドラインとは異なります。 - プライマリ コンストラクター (C# 12 以降) を使用する例では、通常、プライマリ コンストラクター パラメーターはクラス メンバーによって直接使用されます。
Razor コンポーネント構文の詳細は、ASP.NET Core Razor コンポーネントの「Razor の構文」セクションにあります。
次に示すのは、カウンター コンポーネントの例と、Blazor プロジェクト テンプレートから作成されるアプリの一部です。 コンポーネントの詳細については、このドキュメントで後述する "コンポーネント" の記事を参照してください。 次の例では、このドキュメントで後述する "コンポーネント" についての記事の前にある "基礎" に関する記事で説明されているコンポーネントの概念を示します。
Counter.razor
:
コンポーネントでは、対話型レンダリング モードが親コンポーネントから継承されるか、アプリにグローバルに適用されるものと想定されています。
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount() => currentCount++;
}
コンポーネントでは、対話型レンダリング モードが親コンポーネントから継承されるか、アプリにグローバルに適用されるものと想定されています。
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount() => currentCount++;
}
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
前の Counter
コンポーネントは次のようなものです。
- 最初の行の
@page
ディレクティブでルートを設定します。 - ページのタイトルと見出しを設定します。
@currentCount
で現在のカウントをレンダリングします。currentCount
は、@code
ブロックの C# コードで定義されている整数変数です。IncrementCount
メソッドをトリガーするボタンを表示します。このメソッドは@code
ブロックにあり、currentCount
変数の値を増やします。
レンダー モード
"基本" ノードの記事では、レンダリング モードの概念を参照します。 このトピックの詳細については、"コンポーネント" ノードの「ASP.NET Core Blazor レンダリング モード」の記事で詳しく説明されています。記事の "基本" ノードの後に記載されています。
レンダリング モードの概念に関するこのノードの記事では、初期の参照については、現時点では以下の点にのみ注意してください:
Blazor Web App のすべてのコンポーネントは、レンダリング モードを採用して、使用するホスティング モデル、レンダリングされる場所、サーバー上で静的にレンダリングされるかどうか、サーバー上でユーザーの対話機能を使用してレンダリングされるかどうか、またはクライアント上のユーザー対話機能 (通常はサーバー上でプリレンダリング) 用にレンダリングされるかどうかを判断します。
.NET 8 以前の ASP.NET Core リリースの Blazor Server と Blazor WebAssembly アプリは、レンダリング モードではなく、ホスティング モデルの概念に固定されたままです。 レンダリング モードは、概念的には .NET 8 以降の Blazor Web App に適用されます。
次の表は、Blazor Web App で Razor コンポーネントをレンダリングするために使用できるレンダー モードを示しています。 レンダリング モードは、コンポーネント インスタンスまたはコンポーネント定義に関する @rendermode
指令があるコンポーネントに適用されます。 アプリ全体のレンダリング モードを設定することもできます。
名前 | 説明 | レンダーの場所 | Interactive |
---|---|---|---|
静的サーバー | 静的サーバー側レンダリング (静的 SSR) | [サーバー] | いいえ |
対話型サーバー | Blazor Server を使用した対話型サーバー側レンダリング (対話型 SSR) | [サーバー] | はい |
対話型 WebAssembly | Blazor WebAssembly を使用したクライアント側レンダリング (CSR)† | クライアント | はい |
対話型自動 | 最初に Blazor Server、その後 Blazor バンドルのダウンロード後の後続のアクセスに CSR を使用する、対話型 SSR | サーバー、その後クライアント | はい |
†クライアント側レンダリング (CSR) は対話型と見なされます。 ""対話型" クライアント側レンダリング" と ""対話型" CSR" は業界や Blazor のドキュメントでは使用されません。
レンダリング モードに関する上記の情報は、"基本" ノードの記事を理解するために知る必要のあるすべてです。 Blazor を利用するのが初めてで、目次の順に Blazor 記事を読まれている場合、"コンポーネント" ノードの「ASP.NET Core Blazor レンダリング モード」の記事に到達するまでは、レンダリング モードに関する詳細な情報の使用を遅らせることができます。
ドキュメント オブジェクト モデル (DOM)
ドキュメント オブジェクト モデルへの参照では、省略形 DOM を使用します。
詳細については、次のリソースを参照してください。
Blazor WebAssembly アプリ用 .NET API のサブセット
Blazor WebAssembly のブラウザーでサポートされている特定の .NET API のキュレーションされた一覧は使用できません。 ただし、手動で [UnsupportedOSPlatform("browser")]
の注釈が付いた .NET API の一覧を検索して、WebAssembly でサポートされていない .NET API を見つけることができます。
Note
通常、.NET 参照ソースへのドキュメント リンクを使用すると、リポジトリの既定のブランチが読み込まれます。このブランチは、.NET の次回リリースに向けて行われている現在の開発を表します。 特定のリリースのタグを選択するには、[Switch branches or tags](ブランチまたはタグの切り替え) ドロップダウン リストを使います。 詳細については、「ASP.NET Core ソース コードのバージョン タグを選択する方法」 (dotnet/AspNetCore.Docs #26205) を参照してください。
詳細については、次のリソースを参照してください。
サンプル アプリ
ドキュメント サンプル アプリを調べたりダウンロードしたりできます。
Blazor サンプル GitHub リポジトリ (dotnet/blazor-samples
)
使用している .NET のバージョンと一致するバージョン フォルダーを最初に選択して、サンプル アプリを見つけます。
リポジトリ内のサンプル アプリ:
- Blazor Web App
- Blazor WebAssembly
- Blazor Web App と EF Core (ASP.NET Core Blazor と Entity Framework Core (EF Core))
- Blazor Web App と SignalR (ASP.NET Core SignalR と Blazor を使用する)
- 2 つの Blazor Web App と Web (サーバー) API を呼び出すための Blazor WebAssembly アプリ (ASP.NET Core Blazor アプリから Web API を呼び出す)
- OIDC を使用した Blazor Web App (BFF および BFF 以外のパターン) (OpenID Connect (OIDC) を使用して ASP.NET Core Blazor Web App をセキュリティで保護する)
- Blazor WebAssembly スコープが有効なログ (ASP.NET Core Blazor のログ)
- Blazor WebAssembly と ASP.NET Core Identity (セキュリティ保護された ASP.NET Core Blazor WebAssembly と ASP.NET Core Identity)
- Blazor Web App と、Razor クラス ライブラリ (RCL) によって提供される共有 UI を使用した .NET MAUIBlazor Hybrid アプリ (Blazor Web App を使用して .NET MAUIBlazor Hybrid アプリを構築する)
サンプル リポジトリには、2 種類のサンプルが含まれています。
- サンプル アプリのスニペットが、記事に表示されているコード例を提供します。 これらのアプリはコンパイルされますが、必ずしも実行可能なアプリではありません。 これらのアプリは、記事に表示されるコード例を取得するだけの場合に便利です。
- Blazor の記事に付随するサンプル アプリは、次のシナリオでコンパイルして実行できます。
- EF Core を含む Blazor Server
- SignalR を使用する Blazor Server と Blazor WebAssembly
- Blazor WebAssembly スコープ対応のログ記録
リポジトリ内のサンプルの詳細と一覧については、gitHub リポジトリ README.md ファイル Blazor サンプルを参照してください。
ASP.NET Core リポジトリの基本テスト アプリは、さまざまな Blazor シナリオに役立つサンプル のセットでもあります:
ASP.NET Core 参照ソースの BasicTestApp
(dotnet/aspnetcore
)
メモ
通常、.NET 参照ソースへのドキュメント リンクを使用すると、リポジトリの既定のブランチが読み込まれます。このブランチは、.NET の次回リリースに向けて行われている現在の開発を表します。 特定のリリースのタグを選択するには、[Switch branches or tags](ブランチまたはタグの切り替え) ドロップダウン リストを使います。 詳細については、「ASP.NET Core ソース コードのバージョン タグを選択する方法」 (dotnet/AspNetCore.Docs #26205) を参照してください。
サンプル アプリをダウンロードするには:
- Blazor サンプル リポジトリ ZIP ファイルをダウンロードします。
- ファイルを解凍します。
バイト倍数
.NET バイト サイズでは、1024 の累乗に基づいて、10 進数以外のバイトの倍数にメトリック プレフィックスが使用されます。
名前 (略称) | サイズ | 例 |
---|---|---|
キロバイト (KB) | 1,024 バイト | 1 KB = 1,024 バイト |
メガバイト (MB) | 1,0242 バイト | 1 MB = 1,048,576 バイト |
ギガバイト (GB) | 1,0243 バイト | 1 GB = 1,073,741,824 バイト |
サポート リクエスト
dotnet/AspNetCore.Docs
リポジトリには、ドキュメント関連のイシューのみが適しています。 製品のサポートの場合は、ドキュメントのイシューを開かないでください。 次のサポート チャネルの 1 つまたは複数でサポートを受けることができます:
フレームワークの潜在的なバグまたは製品のフィードバックについては、dotnet/aspnetcore
のイシューで ASP.NET Core 製品ユニットに対するイシューを開いてください。 通常、バグ レポートには次のものが "必要です"。
- 問題の明確な説明: イシューを開くと製品ユニットによって提供される GitHub イシュー テンプレートの手順に従います。
- 最小限の再現プロジェクト: 製品ユニット エンジニアがダウンロードして実行できるように、プロジェクトを GitHub に置きます。 イシューの開始コメントにプロジェクトをクロスリンクします。
Blazor の記事に関する問題である可能性がある場合は、ドキュメントのイシューを開きます。 ドキュメントの問題を開くには、記事の下部にある [ドキュメントの問題を開く] フィードバック リンクを使用します。 問題に追加されたメタデータにより、追跡データが提供され、記事の作成者に自動的に ping が送信されます。 ドキュメントの問題を開くまえに、その件について製品ユニットで説明されていた場合は、ドキュメントの問題の開始コメントに、エンジニアリング問題へのクロスリンクを付けておきます。
Visual Studio に関する問題またはフィードバックについては、Visual Studio 内から問題の報告または機能の提案のジェスチャを使用して、Visual Studio の内部のイシューを開きます。 詳しくは、Visual Studio のフィードバックに関するページをご覧ください。
Visual Studio Code の問題については、コミュニティ サポート フォーラムでサポートを依頼してください。 バグ レポートと製品のフィードバックについては、microsoft/vscode
GitHub リポジトリでイシューを開いてください。
Blazor ドキュメントに関する GitHub のイシューは、Blazor.Docs
プロジェクト (dotnet/AspNetCore.Docs
GitHub リポジトリ) でトリアージのために自動的にマークされます。 応答があるまでしばらくお待ちください (特に週末や休日)。 通常、平日であればドキュメントの作成者が 24 時間以内に応答します。
Blazor リソースへのコミュニティ リンク
コミュニティによって管理されている Blazor リソースへのリンクのコレクションについては、「Awesome Blazor」をご覧ください。
メモ
Microsoft は、Awesome Blazor およびそこで説明やリンクされているほとんどのコミュニティ製品やサービスを、所有、保守、またはサポートしていません。
ASP.NET Core