| 価値 | |
|---|---|
| ルール識別子 | BL0008 |
| カテゴリ | Usage |
| 修正が破壊的であるか非破壊的であるか | Non-breaking |
原因
プロパティには [SupplyParameterFromForm] 属性 があり、既定以外のプロパティ初期化子で初期化されます。
ルールの説明
フォームの送信中にプロパティ初期化子を null で上書きできるため、次の例外で EditForm が失敗します。
InvalidOperationException: EditForm requires either a Model parameter, or an EditContext parameter, please provide one of these.
アナライザーは、このパターンが検出されたときに開発者に警告しますが、同じ問題を引き起こさない既定値の初期化子 (null、 null!、 default、 default!) は安全に無視します。
プロパティ初期化子を持つ次の 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();
警告を抑制するタイミング
この規則による警告は抑制しないでください。
ASP.NET Core