共用方式為


BL0008:元件參數應該是自動屬性

價值觀
規則識別碼 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();

隱藏警告的時機

請勿隱藏此規則的警告。