Condividi tramite


BL0008: i parametri del componente devono essere proprietà automatiche

Value
ID della regola BL0008
Categoria Usage
La modifica è dirompente o non dirompente Non-breaking

Motivo

Una proprietà ha l'attributo[SupplyParameterFromForm] e viene inizializzata con un inizializzatore di proprietà non predefinito.

Descrizione regola

L'inizializzatore di proprietà può essere sovrascritto con null durante l'invio del modulo, provocando il fallimento di EditForm e generando la seguente eccezione:

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

L'analizzatore avvisa gli sviluppatori quando viene rilevato questo modello, ignorando in modo sicuro gli inizializzatori di valori predefiniti (null, null!, default, default!) che non causano lo stesso problema.

Si consideri il seguente modello di modulo Input con un inizializzatore di proprietà:

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

L'analizzatore segnala l'avviso seguente, dove il {COMPONENT} segnaposto è il nome del tipo di componente:

Proprietà '{COMPONENT}.Input' ha [SupplyParameterFromForm] e un inizializzatore di proprietà. Può essere sovrascritto con null durante gli invii del modulo.

Modelli sicuri ignorati dall'analizzatore:

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

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

Come correggere le violazioni

Per assicurarsi che il valore inizializzato non venga sovrascritto, spostare l'inizializzazione in uno dei metodi del OnInitialized{Async} ciclo di vita.

Si consideri il componente seguente Razor che genera un avviso di analisi del codice BL0008 perché il Input modello per il modulo è decorato con [SupplyParameterFromForm] e ha un inizializzatore di proprietà:

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

Per correggere la violazione, il codice di inizializzazione per la Input proprietà viene spostato nel OnInitialized metodo del ciclo di vita, lasciando la proprietà come proprietà implementata automaticamente (proprietà automatica). La modifica seguente apporta anche un Input:

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

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

Quando eliminare gli avvisi

Non eliminare un avviso da questa regola.