.NET 8 RC1(正確にはPreview 6?)からblazorserverプロジェクトテンプレートが無くなってしまった。
.NET Blogによると、
.NET 8 では、Web UI のすべてのニーズに Blazor コンポーネントのフルスタックを使用できるように、Blazor に機能を追加してきました。 要求に応じてサーバーから Blazor コンポーネントを静的にレンダリングし、強化されたナビゲーションとフォーム処理でエクスペリエンスを段階的に強化し、サーバーでレンダリングされた更新をストリーミングし、Blazor Server または Blazor WebAssembly を使用して必要な場合に豊かな対話機能を追加できるようになりました。 アプリの読み込み時間を最適化するために、Blazor は実行時に Blazor Server と Blazor WebAssembly のどちらを使用するかを自動選択することもできます。
とのこと。
Server SideのBlazorコンポーネントを動かすには、blazorプロジェクトテンプレートを使用する必要がある。このテンプレートのオプションを見ると、デフォルトでServer Sideを使用するらしい。
The default value is false.
Type: bool
Default: false
-us, –use-server Configures whether to support rendering components interactively on the server via a SignalR WebSocket connection.
The default value is true.
Type: bool
Default: true
で、blazorテンプレートでコンポーネントを作ってみたのだが、イベントのハンドリングとかが全然動作しない。.NET Blogの記事を見てもよくわからないし、他の記事でもRC1以前のものばかりで良く分からない。
仕方ないので、サンプルのCounterコンポーネントを見てみると、先頭に以下のようなディレクティブが・・・
@page "/counter"
@attribute [RenderModeServer]
どうもこの属性を指定しないと、サーバーサイドでレンダリングされないようだ。
とりあえず、この属性を指定したら、コンポーネントが動作するようになった。
結構、破壊的な変更だよね。
ちなみに、-uwを付けて、プロジェクトを作成すると、サンプルコンポーネント用プロジェクトとサーバープロジェクトが作成され、コンポーネントプロジェクトが、ProjectReferenceとしてサーバープロジェクトに参照される形となる。
Program.csを見ると、()
builder.Services.AddRazorComponents()
.AddServerComponents()
.AddWebAssemblyComponents();
・・・
app.MapRazorComponents
.AddServerRenderMode()
.AddWebAssemblyRenderMode();
となっており、ServerSideコンポーネントでもWASMコンポーネントでも実行できるようになっているようだ。
コンポーネントプロジェクト上のCounterコンポーネントには以下の属性が指定されている。
@attribute [RenderModeAuto]
要は、呼び出される元によって、wasmかServer Sideかが決定される様子。
サーバー上のCounterコンポーネントでは、単純に以下のような形でコンポーネントを呼び出している。
<プロジェクト名.Client.Pages.Counter />
.NET8リリース版では、Blazor ServerSideプロジェクトテンプレートが復活している。ちなみに、Blazorテンプレートを使用する場合、「静的サーバー」レンダリングがデフォルトとなり、動的なレンダリングを行なうには、下記のディレクティブを指定する。
「対話型サーバーレンダリング」
@rendermode InteractiveServer
「対話型Web Assembly」
@rendermode InteractiveWebAssembly
「自動判定」
@rendermode InteractiveAuto
ちなみに、静的サーバレンダリングで実行中画面などを表示する場合は、下記を指定。
@attribute [StreamRendering]