はじめに
現在、Blazor Server を使用してアプリケーションを作成しています。.NET 7のサンプルアプリから徐々に改良して作成していきました。
2023/11/14に.NET 8がリリースされました。早速、Target frameworkを「.NET 8」に変更してみると、これが動かないんですよね。
既に社内ライブラリーは、.NET 8に上げてしまったので正直焦りました。
原因を調査するには時間が足りないため、しばらくは.NET 7のまま開発を進めていました。
そして、冬季休暇になった段階で、ようやく落ち着いて調べることが出来ました。
変更点
.NET 8のサンプルアプリから徐々に現在のアプリケーションに近づける方法で調査していきました。
フォルダ構成
.NET 7では、直下にPages
フォルダとShared
フォルダがありましたが、.NET 8では、直下にComponents
フォルダが追加され、配下にPages
フォルダとShared
フォルダが移動されました。
これによりネームスペースの変更が必要となります。
_Host.cshtml から App.razor へ
Pages
フォルダ内の_Host.cshtml
ファイルはApp.razor
ファイルに変更になりました。
linkタグやscriptタグは、App.razor
ファイルに記載するようになります。
他にも下記ファイルなどが変更になっています。
<link rel="stylesheet" href="css/site.css" />
↓
<link rel="stylesheet" href="css/app.css" />
<script src="_framework/blazor.server.js"></script>
↓
<script src="_framework/blazor.web.js"></script>
相対ディレクトリの指定
【2024/02/12追記】 別記事にしました。
デプロイした時に正しくレンダリングされない件がありました。
アイコンのopen-iconic削除
Blazor プロジェクト テンプレートは、アイコンの Open Iconic に依存しなくなったことで削除されました。
今回は使用していなかったので、特に影響はなかった。
Program.cs の中身
Program.cs
ファイルの中身も変更されています。
下記は例となります。
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
⋮
app.UseAntiforgery();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
⋮
app.UseRouting();
app.UseForwardedHeaders();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
レンダーモード
.NET 7から.NET 8の変更点で一番重要でした。
サンプルアプリで、Counterの内容をHome側に追加した時に、Counterボタンをクリックしても何も動作しない。何が違うんだろうと見比べた時に「rendermode InteractiveServer」の記載がないことに気が付きました。これをHome側に追加すると、Counterボタンのクリック処理が動作しました。
@rendermode InteractiveServer
上記サイトを読み、「アプリ全体にレンダリング モードを適用する」の記載を見つけて、App.razor
ファイルに追加しました。
<Routes @rendermode="InteractiveServer" />
現在作成中のアプリケーションでは、MainLayout コンポーネント側(親子関係)にデータを反映させるのにカスケーディングを使用してパラメーターを渡す方法を採用していました。
アプリ全体にレンダリング モードを適用することで、ようやく.NET 8でも動作させることが出来ました。
一時は、「CascadingValue Value="this"」が使えないので、「AddCascadingValue メソッド」に修正しなければならないかと危惧していました。
最後に
Target frameworkを「.NET 8」に変更するだけと気軽に考えていただけに、かなりキツかったです。
Blazorは発展途上のところもあるわけですが、.NET 7から.NET 8の変更が大きな転換点で、ここから先はそんな変わらないと思いたいです。