Che cosa causa se le espressioni / else vengono rivalutate?

asp.net-core blazor c#

Domanda

Lavorando sul modello ospitato da Blazor, nel mio MainLayout.cshtml, ho qualcosa del tipo:

@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
    <div class="login-panel">
        <p>Hi Bob!</p>
    </div>
}
else
{
    <LoginPanel />
}

e quindi in un separato Login.cshtml:

@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
    <div class="login-panel">
        <p>Hi Bob!</p>
    </div>
}
else
{
    <LoginPanel />
}

Ma l'accesso non causa una modifica al "pannello di login" in MainLayout.cshtml. Sono stato in grado di farlo funzionare se tutto è in un unico file e sto solo verificando se una particolare variabile è nullo o no (vedi qui ), quindi presumo che il framework Blazor abbia criteri specifici che illecano una pagina valutare tali blocchi. È accurato? In tal caso, qual è il modo migliore per forzare questa rivalutazione?

Modifica: Ho giocato un po 'di più, alla fine StateHasChanged scoperto la funzione membro protetto StateHasChanged , che presumo viene chiamata dopo che Init è stato completato, quindi perché l'esempio precedente funziona. Credo che una soluzione di lavoro è quella di avere il mio UserInfo oggetto implementare INotifyPropertyChanged , e quindi registrare un gestore di cambiamento all'interno MainLayout.cshtml chiamare StateHasChanged() per le viste che hanno bisogno di aggiornare quando lo stato di accesso.

Risposta accettata

Sì. Blazor usa qualcosa chiamato StateHasChanged proprio come INotifyPropertyChanged .

Tuttavia la differenza è, in XAML framework XAML aggiornerà solo quelle proprietà che ha chiamato INotifyPropertyChanged , ma nel rasoio quando StateHasChanged è chiamato il quadro UI aggiornerà tutto l'albero UI del componente (almeno fin d'ora) dell'elemento risiede . Quindi chi ha chiamato StateHasChanged se non è stato fatto da te. Quando un elemento riceve un input (Stai facendo clic su un pulsante), il blazer imposterà automaticamente lo StateHasChanged sotto il cofano.

Altre letture "

https://github.com/aspnet/Blazor/issues/409

https://learn-blazor.com/pages/data-binding/

https://github.com/aspnet/Blazor/issues/359

https://github.com/aspnet/Blazor/issues/407




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché