| 价值 | |
|---|---|
| 规则 ID | 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 表单的模型经过 [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();
何时禁止显示警告
不禁止显示此规则发出的警告。