(8/30)みんなで学ぶBlazor:CSSスタイルの変更とデータバインディングの詳細

(8/30)みんなで学ぶBlazor:CSSスタイルの変更とデータバインディングの詳細

今、プロジェクトを起動するたびに、デフォルトのパスは`/`になりますが、現在このルートに適用されているComponentはありません。手動で`Post`に切り替えるのは面倒です。また、Menuのアイコンが名前と合っていないので、調整しましょう。

最終更新 2021/12/13 22:36
StrayaWorker
読了目安 2 分
カテゴリ
Blazor
テーマ
みんなで学ぶBlazorシリーズ
タグ
.NET C# ASP.NET Core Blazor

現在プロジェクトを起動するたびに、既定のパスは / になります。しかし、現時点ではこのルートに適用する Component はなく、手動で Post に切り替えるのは少々面倒です。また、Menu のアイコンが名称と一致していないので、調整していきましょう。

まずアイコンを変更します。font-awesome は現在会員制で、ログインしないと無料のアイコンセットを生成できないため、筆者は bootstrapicon を使用します。まず bootstrapicon ページから zip ファイルをダウンロードし(ファイルをダウンロードしたくない場合は CDN を直接参照してください)、ファイルを解凍して wwwroot に配置します。_Layout.cshtmlbootstrap-icons.css を参照し、公式サイトでお好みのアイコンを検索して適用します。筆者はさらにスタイル調整も行いました。

bootstrapダウンロードアイコンページ1

bootstrapダウンロードアイコンページ2

bootstrapダウンロードアイコンページ2

bootstrapダウンロードアイコンページ3

bootstrapクラスの変更

bootstrapアイコン

次に、Blazor Server プロジェクトの launchSettings.json ファイルを開き、profiles 内の BlazorServer に次の行を追加します。"launchUrl": "Post"。

Day06 でバインディングについて触れましたが、その時は form を表示することが目的だったので軽く触れただけでした。ここで詳しく説明します。

Blazor のデータバインディングには、単方向バインディング (one way binding) と双方向バインディング (two way binding) があります。単方向バインディングは、ページ上で @variable と記述し、データがあればそれをそのまま表示します。

単方向バインディング

双方向バインディングでは、@bind-value を使用して input 内のデータとページを結びつけ、ページに入力した内容がデータに逆向きに影響します。

双方向バインディング

Angular を学んだことがある方には馴染み深いでしょう。[ngModel] と [(ngModel)] の用途と同じで、名前が変わっただけです。

では、Blazor に Angular の (click) イベントバインディングのようなものはあるのでしょうか?もちろんあります。ただし、<InputText> Component を使用すると EventCallBack のような複雑な内容になるため、筆者はここでは単純な <input> 要素を使用し、EventCallBack については後で説明する際に改めて触れます。

まず <InputText><input> に置き換えます。次に @bind-Value@bind に変更し、さらに @bind:event を追加します。値は onchangeoninput などの HTML イベント名で、これらのイベントは MDN で確認できます。その後、Web ページの入力フィールドに内容を入力すると、下の文字が即座に変化するのが確認できます。フォーカスが input 要素に残っていても、下の内容が変わっていることがわかります。

イベントバインディング

ただし、oninputonchange の使い分けは慎重に行う必要があります。oninputnumber 型のデータにバインドした場合、ユーザーが 1.5 と入力した瞬間に 1 に変更されてしまい、ユーザーを混乱させる可能性があります。onchange を使用すれば、ユーザーがフォーカスを外した後に 1.5 が 1 に変更されます。どうしても oninput を使わなければならない場合は、バインドするデータを nullable または文字列にし、getter/setter を使って不正データの処理を自前で実装することもできます。

では、Blazor には Angular の pipe のように数値や日時などのデータ形式を変更する機能はあるのでしょうか?現在は @bind:format バインディングを使用して日付形式を変更できます。まず PostModelCreateDateTime を追加し、次にタイトルの div をコピーして貼り付け、label@bind のバインドデータを変更し、@bind:event@bind:format に変更すると、指定した日付形式で表示されます。

形式バインディング

注意すべき点として、Blazor には <select> に対応する Component はありません。なぜなら、HTML の attributenull を取れないからです。null に最も近い概念は value という attribute 自体を削除することですが、value のない <option> を選択すると、ブラウザはその <option> のテキストを value として扱います。

本記事の参照:

注:本記事のコードは .NET 6 + Visual Studio 2022 でリファクタリングされています。原文のリンクからリファクタリング後のコードと比較して学習できます。ご愛読ありがとうございます。原作者をサポートしてください。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2021/12/25

(29/30)みんなで学ぶBlazor:Blazor単体テスト

システム開発において最も退屈なプロセスは、おそらくバグ修正です。特に、null オブジェクトにアクセスしようとするエラー(`Object reference not set to an instance of an object.`)は、多くの初心者が最初に直面する問題です。退屈なバグ修正から解放されるために、この記事では「単体テスト」を紹介します。

続きを読む
同じカテゴリ / 同じタグ 2021/12/25

(28/30)みんなで学ぶBlazor:ポリシーベースの認可

以前に「ASP.NET Core Identity」は「Claim」ベースの検証を使用すると述べましたが、実は「ASP.NET Core Identity」には異なる種類の認可方法があります。最も簡単な「ログイン認可」「ロール認可」「Claim認可」ですが、これらはすべて同じ方法で実現されています:原則認可(ポリシーベースの認可)です。

続きを読む