可以让Blazor WebAssembly使用导航更新组件吗?

时间:2019-11-15 10:25:51

标签: routing blazor webassembly blazor-client-side

我一直在使用Blazor WebAssembly示例作为新应用程序的基础,并且运行良好。但我希望使NavMenu更动态。

在这种情况下,我想在NavMenu中有特定于管理员/主持人的选项,我要在用户登录后尝试添加这些选项。我目前正在使用NavigationManager.NavigateTo(page,false)在Razor页面之间进行切换。它实际上实际上是一个Razor页面,因此,登录名和动态表位于同一页面上,具体取决于应用程序是否具有令牌。

我使用false选项来确保它不会刷新整个页面,否则令牌将丢失。我现在发现奇怪的是,如果单击NavBar,它将更新NavBar,显示新的管理选项,这很好。但是我希望使用NavigationManager.NavigateTo(page,false)在代码中执行相同的操作,也可以使导航栏更新。

我一直在看一些有关Blazor以及如何使用组件的视频和教程,但是我仍然发现它使如何在组件之间调用以及获取外部/父组件进行更新感到困惑。

我可以想到不同的方法使它工作,但我希望弄清楚实现它的正确方法是什么,并遵循代码约定。我怀疑即使我一直在研究这样的东西,我也缺少一些基本的方法来做这样的事情。

我添加的代码

        <li class="nav-item px-3">
            <NavLink class="nav-link" href="counter">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Noter
            </NavLink>
        </li>
        @if (ApiService.Token.HasValue)
        {
            <li class="nav-item px-3">
                <NavLink class="nav-link" href="logout">
                    <span class="oi oi-list-rich" aria-hidden="true"></span> AdminStuff
                </NavLink>
            </li>
        }
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="logout">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Log ud
            </NavLink>
        </li>

2 个答案:

答案 0 :(得分:1)

AuthorizeView与基于角色或策略的授权一起使用

答案 1 :(得分:0)

我找到了一种方法,但是我怀疑这不是最好或最合适的方法。

我这样创建了一个静态EventManager:

    public static class EventManager
    {
        public static List<Action> renderActions = new List<Action>();
        public static void AddRenderAction(Action renderAction)
        {
            renderActions.Add(renderAction);
        }

        public static void TriggerRenderActions()
        {
            renderActions.ForEach(a => a.Invoke());
        }
    }

,然后在NavMenu.razor组件的OnInitialized方法中添加固有的“ StateHasChanged”方法:

protected override void OnInitialized()
        {
            EventManager.AddRenderAction(()=>StateHasChanged());
        }

这样,我可以从任何地方调用EventManager.TriggerRenderActions()来运行所有添加的动作。