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

时间:2018-04-08 02:02:01

标签: c# asp.net-core blazor

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

@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(参见here),我能够让它工作,所以我假设Blazor框架有特定的标准,这是非法的页面重新评估此类块。这准确吗?如果是这样,强制进行重新评估的最佳方法是什么?

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

1 个答案:

答案 0 :(得分:1)

是。 Blazor使用StateHasChanged之类的内容,就像INotifyPropertyChanged一样。

但不同之处在于,在 XAML 框架中, XAML 更新已调用INotifyPropertyChanged的属性,但是当StateHasChanged被称为UI框架时,Razor将刷新元素所在的组件的整个UI树(至少截至现在)。 然后,如果你没有完成,StateHasChanged已经打过电话。当一个元素得到一个输入(你点击一个按钮)时,该剃刀会自动设置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