我将Blazor与.NET Core 3.0结合使用。
当用户尚未登录时,我想在菜单中显示登录名。当他登录时,登录导航项应被隐藏。我怎样才能做到这一点?

编辑:
我通过使用异步任务更改了OnInitializedAsync方法,但这不是问题。对于第一次加载,它可以正常工作。但是,然后我转到登录页面,登录并通过NavigationManager导航到主页,菜单将不会“刷新”。我该如何解决?

以下代码不起作用...

<div>
    <ul class="nav flex-column">
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                <span class="oi oi-home" aria-hidden="true"></span> Home
            </NavLink>
        </li>
        @if (!_isLoggedIn)
        {
            <li class="nav-item px-3">
                <NavLink class="nav-link" href="login">
                    <span class="oi oi-person" aria-hidden="true"></span> <LocalizedString Key="NavMenuLogin" />
                </NavLink>
            </li>
            <li class="nav-item px-3">
                <NavLink class="nav-link" href="licenseedit">
                    <span class="oi oi-spreadsheet" aria-hidden="true"></span> <LocalizedString Key="NavMenuRegistration" />
                </NavLink>
            </li>
        }
    </ul>
</div>

@code{

    private bool _isLoggedIn;

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        await TokenExistAsync();
    }

    private async Task TokenExistAsync()
    {
        var retVal = await Http.GetStringAsync("api/Login/ExistToken");
        _isLoggedIn = retVal == "yes";
    }

}

最佳答案

我在上面更改了代码,但仍然无法正常工作


我想我了解您想要的...只要我是对的,以下是实现此目的的代码...您想从登录名刷新嵌入在MainLayout组件中的NavMenu组件的内容页面,对吗?

您可以使用多种方法来实现此目的。以下解决方案基于应用程序状态模式。

首先,我们必须创建一个可以从NavMenu组件和Login组件访问的服务类。这是课程:

public class AppState
{
    private bool _loggedIn;
    public event Action OnChange;
    public bool LoggedIn
    {
        get { return _loggedIn; }
        set {
            if (_loggedIn != value)
            {
                _loggedIn = value;
                NotifyStateChanged();
            }
        }
    }

    private void NotifyStateChanged() => OnChange?.Invoke();
}


此类定义了一个名为OnChange的事件委托,该委托应封装将刷新NavMenu的方法。布尔属性LoggedIn的值更改时,将调用此委托。当用户登录后,LoggedIn属性的值可能会在“登录”页面中更改,因此将通知此委托的任何订阅者(在我们的情况下为NavMenu)。

登录页面


@inject AppState AppState
注意上面将AppState注入登录页面。将其放在页面顶部
AppState.LoggedIn = true;该代码应放在登录过程的末尾。这将启动OnChange委托的触发。


NavMenu组件


@inject AppState AppState
@implements IDisposable


*

protected override void OnInitialized()
{
    AppState.OnChange += StateHasChanged;
}

public void Dispose()
{
    AppState.OnChange -= StateHasChanged;
}


现在,无论何时登录,AppState服务都会通知NavMenu组件重新呈现,以便登录链接不可见(不呈现)。

创业班

services.AddSingleton<AppState>();

09-06 01:33