In meiner MainLayout.cshtml-Datei habe ich so etwas wie:
@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
<div class="login-panel">
<p>Hi Bob!</p>
</div>
}
else
{
<LoginPanel />
}
und dann in einem separaten Login.cshtml:
@inject UserInfo userInfo
async void Login()
{
userInfo.Name = "bob";
}
Die Anmeldung führt jedoch nicht zu einer Änderung des Anmeldebereichs in MainLayout.cshtml. Ich konnte das zum Laufen bringen, wenn alles in einer einzigen Datei ist und ich nur nach einer bestimmten Variablen suche (siehe hier ), also nehme ich an, dass das Blazor-Framework bestimmte Kriterien hat, die eine Seite dazu berechtigen, werte solche Blöcke aus. Ist das genau? Wenn ja, was ist der beste Weg, diese Neubewertung zu erzwingen?
Edit: Ich spielte ein bisschen mehr herum, entdeckte schließlich die StateHasChanged
Protected Member-Funktion, von der ich StateHasChanged
, dass sie nach Init aufgerufen wird, also warum das vorherige Beispiel funktioniert. Ich denke , eine funktionierende Lösung ist mein haben UserInfo
- Objekt implementieren INotifyPropertyChanged
, und dann eine Änderung Handler innerhalb MainLayout.cshtml registrieren nennen StateHasChanged()
für Ansichten , die aktualisiert werden müssen, wenn Änderungen Login - Status.
Ja. Blazor verwendet etwas namens StateHasChanged
genau wie INotifyPropertyChanged
.
Jedoch ist der Unterschied, in XAML Frameworks der XAML nur diejenigen Eigenschaften aktualisieren , die aufgerufen hat INotifyPropertyChanged
, aber in Rasiermesser wenn StateHasChanged
wird der UI - Framework wird aktualisiert den gesamten UI Baum der Komponente (zumindest ab jetzt) das Element genannt residiert . Wer hat dann den StateHasChanged
wenn es nicht von dir gemacht wird. Wenn ein Element eine Eingabe erhält (Sie klicken auf eine Schaltfläche), wird der Blazor automatisch den StateHasChanged
unter der Haube setzen.
Mehr liest "
https://github.com/aspnet/Blazor/issues/409
https://learn-blazor.com/pages/datenbindung/