BL0008:组件参数应为自动属性

价值
规则 ID BL0008
类别 Usage
修复是中断修复还是非中断修复 Non-breaking

原因

属性具有[SupplyParameterFromForm] 属性,并通过非默认的属性初始化器进行初始化。

规则说明

属性初始值设定项在表单提交期间可能被null覆盖,导致EditForm失败,并抛出以下异常:

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

分析器会在检测到此模式时警告开发人员,同时安全地忽略不会导致相同问题的默认值初始值设定项(nullnull!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 表单的模型经过 [SupplyParameterFromForm] 修饰且设有属性初始化器而触发了 BL0008 代码分析警告:

<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 生命周期方法,使属性作为 自动实现的属性(auto 属性保留。 以下变更也使Input成为可空引用类型(NRT)

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

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

何时禁止显示警告

不禁止显示此规则发出的警告。