是什么原因导致if / else表达式被重新评估?

asp.net-core blazor c#

使用Blazor托管模板,在我的MainLayout.cshtml中,我有类似的东西:

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

然后在一个单独的Login.cshtml中:

@inject UserInfo userInfo
async void Login()
{
    userInfo.Name = "bob";
}

但登录不会导致MainLayout.cshtml中的“登录面板”发生变化。如果所有内容都在一个文件中,并且我只检查特定变量是否为null(参见此处 ),那么我能够使其工作,所以我假设Blazor框架具有特定的标准,这些标准会使页面无法恢复评估这样的块。这准确吗?如果是这样,强制进行重新评估的最佳方法是什么?

编辑:我玩了一下,最终发现了StateHasChanged受保护的成员函数,我假设在Init完成后调用,因此上一个示例的工作原理。我认为一个有效的解决方案是让我的UserInfo对象实现INotifyPropertyChanged ,然后在MainLayout.cshtml中注册一个更改处理程序,以便为登录状态更改时需要更新的视图调用StateHasChanged()

一般承认的答案

是。 Blazor使用了一个名为StateHasChanged东西,就像INotifyPropertyChanged一样。

然而不同的是,在XAML框架中, XAML 只会更新那些调用了INotifyPropertyChanged属性,但是在Razor中调用StateHasChanged时,UI框架将刷新组件的整个UI树( 至少截至目前 ),该元素正在驻留。然后,如果你没有完成,那么他们已经召集了StateHasChanged 。当一个元素得到一个输入(你点击一个按钮)时,blazor会自动设置StateHasChanged

更多读“

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow