14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Blazor Serverで.NET 7から.NET 8への移行方法

Last updated at Posted at 2024-01-13

はじめに

現在、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ファイルの中身も変更されています。
下記は例となります。

.NET 7のProgram.cs
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
 
app.UseAntiforgery();

app.MapRazorComponents<App>()
	.AddInteractiveServerRenderMode();
.NET 8のProgram.cs
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ファイルに追加しました。

App.razor
<Routes @rendermode="InteractiveServer" />

現在作成中のアプリケーションでは、MainLayout コンポーネント側(親子関係)にデータを反映させるのにカスケーディングを使用してパラメーターを渡す方法を採用していました。

アプリ全体にレンダリング モードを適用することで、ようやく.NET 8でも動作させることが出来ました。
一時は、「CascadingValue Value="this"」が使えないので、「AddCascadingValue メソッド」に修正しなければならないかと危惧していました。

最後に

Target frameworkを「.NET 8」に変更するだけと気軽に考えていただけに、かなりキツかったです。

Blazorは発展途上のところもあるわけですが、.NET 7から.NET 8の変更が大きな転換点で、ここから先はそんな変わらないと思いたいです。

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?