次の方法で共有


BL0008: コンポーネント パラメーターは自動プロパティにする必要があります

価値
ルール識別子 BL0008
カテゴリ Usage
修正が破壊的であるか非破壊的であるか Non-breaking

原因

プロパティには [SupplyParameterFromForm] 属性 があり、既定以外のプロパティ初期化子で初期化されます。

ルールの説明

フォームの送信中にプロパティ初期化子を null で上書きできるため、次の例外で EditForm が失敗します。

InvalidOperationException: EditForm requires either a Model parameter, or an EditContext parameter, please provide one of these.

アナライザーは、このパターンが検出されたときに開発者に警告しますが、同じ問題を引き起こさない既定値の初期化子 (nullnull!defaultdefault!) は安全に無視します。

プロパティ初期化子を持つ次の Input フォーム モデルについて考えてみましょう。

[SupplyParameterFromForm]
public InputModel Input { get; set; } = new();

アナライザーは次の警告を報告します。ここで、 {COMPONENT} プレースホルダーはコンポーネントの種類の名前です。

プロパティ '{COMPONENT}。Input' には [SupplyParameterFromForm] とプロパティ初期化子があります。 これは、フォームの投稿中に null で上書きできます。

アナライザーによって無視される安全なパターン:

[SupplyParameterFromForm]
public InputModel Input { get; set; } = default!;

[SupplyParameterFromForm]
public InputModel Input { get; set; } = null!;

違反を修正する方法

初期化された値が上書きされないようにするには、初期化を OnInitialized{Async} ライフサイクル メソッドのいずれかに移動します。

フォームのRazor モデルはInputで修飾され、プロパティ初期化子があるため、BL0008 コード分析警告を生成する次の[SupplyParameterFromForm] コンポーネントについて考えてみましょう。

<EditForm Model="Input" OnSubmit="Submit" FormName="Starship1">
    ...
</EditForm>

@code {
    [SupplyParameterFromForm]
    private InputModel Input { get; set; } = new();

    private void Submit()
    {
        ...
    }

    public class InputModel
    {
        public string? Id { get; set; }
    }
}

違反を修正するために、 Input プロパティの初期化コードは OnInitialized ライフサイクル メソッドに移動され、プロパティは 自動的に実装されるプロパティ (自動プロパティ) のままにされます。 次の変更により、Inputは null 許容参照型 (NRT) にもなります。

[SupplyParameterFromForm]
private InputModel? Input { get; set; }

protected override void OnInitialized() => Input ??= new();

警告を抑制するタイミング

この規則による警告は抑制しないでください。