Sdílet prostřednictvím


BL0008: Parametry součástí by měly být automatické vlastnosti

Hodnota
Identifikátor pravidla BL0008
Kategorie Usage
Oprava je destruktivní nebo nedestruktivní Non-breaking

Příčina

Vlastnost má [SupplyParameterFromForm] atribut a je inicializována nevýchozím inicializátorem vlastností.

Popis pravidla

Inicializátor vlastnosti lze přepsat pomocí null při odesílání formuláře, což způsobí selhání EditForm s následující výjimkou.

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

Analyzátor upozorní vývojáře při zjištění tohoto vzoru, zatímco bezpečně ignoruje výchozí inicializátory hodnot (null, null!, default, ), default!které nezpůsobí stejný problém.

Zvažte následující Input model formuláře s inicializátorem vlastností:

[SupplyParameterFromForm]
public InputModel Input { get; set; } = new();

Analyzátor hlásí následující upozornění, kde {COMPONENT} zástupný symbol je název typu komponenty:

Vlastnost {COMPONENT}.Input má [SupplyParameterFromForm] a inicializátor vlastnosti. To lze při odesílání formuláře přepsat na hodnotu null.

Bezpečné vzory, které analyzátor ignoruje:

[SupplyParameterFromForm]
public InputModel Input { get; set; } = default!;

[SupplyParameterFromForm]
public InputModel Input { get; set; } = null!;

Jak opravit porušení

Pokud chcete zajistit, aby inicializovaná hodnota nebyla přepsána, přesuňte inicializaci do jedné z OnInitialized{Async} metod životního cyklu.

Vezměte v úvahu následující Razor komponentu, která generuje upozornění analýzy kódu BL0008, protože Input model formuláře je zdoben [SupplyParameterFromForm] a má inicializátor vlastností:

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

K odstranění porušení se inicializační kód pro Input vlastnost přesune do OnInitialized metody životního cyklu, přičemž vlastnost zůstává jako automaticky implementovaná vlastnost (auto vlastnost). Následující změna také změní Input na odkazový typ s možnou hodnotou null (NRT):

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

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

Kdy potlačit upozornění

Nepotlačujte upozornění z tohoto pravidla.