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!;

Устранение нарушений

Чтобы убедиться, что инициализированное значение не перезаписывается, переместите инициализацию в один из методов жизненногоOnInitialized{Async} цикла.

Рассмотрим следующий Razor компонент, который создает предупреждение анализа кода BL0008, так как Input модель для формы аннотирована с помощью [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();

Когда следует подавлять предупреждения

Не подавляйте предупреждение из этого правила.