(11/30)みんなで学ぶBlazor:Arbitrary属性

(11/30)みんなで学ぶBlazor:Arbitrary属性

現在`MyButton`には3つの`[Parameter]`があります。さらに増やす場合、また新しい`[Parameter]`を定義しなければなりません。このComponentを更新し続けることを避けるために、Blazorが提供する`@attribute`を使いましょう。

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

現在MyButtonには3つの[Parameter]があります。さらに追加する場合、また新しい[Parameter]を定義する必要があります。このコンポーネントを更新し続けるのを避けるため、Blazorが提供する@attributeを使いましょう。

まず、元の<button><input>に変更し、MyButton.razor[Parameter]を持つInputAttributesを定義します。型はDictionary<string, object>で、初期値を設定しておきます。外部からこのパラメータが渡されなければ、初期値が適用されます。

次に、PostBase.razor.csにも同名の変数を定義しますが、valueclassを少し変更します。

最後に、Post.razorで呼び出すMyButtonにはInputAttributesだけを渡せば完了です。

しかし、どこかおかしい感じがします。というのも、変数InputAttributesを1つだけ使ったため、ResetボタンとSubmitボタンが同じになってしまいました。もしReset用の変数を別に定義すると、また元と同じ手間がかかります。

そこで、[Parameter]のパラメータCaptureUnmatchedValuesを活用します。元の[Parameter][Parameter(CaptureUnmatchedValues = true)]または[Parameter(true)]に変更し、Blazorにこの変数がInputAttributesで定義されていない値もキャプチャすることを伝えます。

次に、PostBase.razor.csの変数InputAttributesを削除します。このような定義はできなくなるからです。もし残した場合どうなるか、後で確認してみましょう。

最後に、PostBase.razor<MyButton>に好きなHTML属性を自由に与えると、SubmitボタンとResetボタンに戻ります。注意点として、自由に定義できるようになったため、強い型付けの制約はなくなります。

ここで、二つの<MyButton>に同じHTML属性typeがあることに気づくかもしれません。重複しているので、PostBase.razor.csInputAttributesで定義できるでしょうか?

残念ながらエラーメッセージによると、CaptureUnmatchedValuesを使うとInputAttributesを明示的に定義できません。そのため、利用者はこの点に特に注意する必要があります。

もう一つ、HTML属性の読み取り順は右から左です。重複したHTML属性がある場合、右側のものが左側を上書きします。MyButton.razor@attributeの右側にvalue="MyButton"を追加すると、Webページを開いたときに両方のボタンが"Mybutton"になります。したがって、初期値を設定する場合は、@attributeの左側に配置して、渡された値を上書きしないようにするのがよいでしょう。

参照:

  1. Blazor Attribute Splatting
  2. Ref: Arbitrary attributes and parameters in Blazor

注:本記事のコードは .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認可」ですが、これらはすべて同じ方法で実現されています:原則認可(ポリシーベースの認可)です。

続きを読む