| 價值觀 | |
|---|---|
| 規則識別碼 | 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!, 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!;
如何修正違規
為了確保初始化值不會被覆寫,請將初始化移至生命週期方法之一。
請考慮以下 Razor 元件,它會產生 BL0008 程式碼分析警告,因為該表單的模型使用了 Input 並且具有屬性初始化:
<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 為 可空引用型別(NRT):
[SupplyParameterFromForm]
private InputModel? Input { get; set; }
protected override void OnInitialized() => Input ??= new();
隱藏警告的時機
請勿隱藏此規則的警告。