Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
| Ценность | |
|---|---|
| Идентификатор правила | 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();
Когда следует подавлять предупреждения
Не подавляйте предупреждение из этого правила.
ASP.NET Core