_LoginPartial和.NET MVC一起使用的动态导航栏

时间:2018-12-15 08:34:41

标签: asp.net-mvc asp.net-core navbar

我一直试图使它起作用,但似乎不起作用。基本上,我需要一个动态导航栏。预先构建的.NET模板实际上已经生成了_LoginPartial.cshtml,它已根据用户是否登录来更改导航栏。我一直在尝试编辑导航栏,以便它支持另一级别的更改来检查用户是否在特定页面上,然后它将显示更多或更少的项目,具体取决于布尔值(showAll)设置为true还是false。但是,有没有一种方法可以根据页面设置布尔值?目前,我通过手动更改对其进行测试,并且其逻辑有效。我需要一种动态方式以编程方式对其进行控制。谢谢您的帮助!

@using Microsoft.AspNetCore.Identity

@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@{bool showAll = false;}

@if (SignInManager.IsSignedIn(User) && showAll == true)
{
    <ul class="nav navbar-nav mr-auto">
        <li class="nav-item"><a asp-area="" asp-controller="Home" asp-action="Index" class="nav-link">Home</a></li>
        <li class="nav-item"><a asp-area="" asp-controller="Home" asp-action="About" class="nav-link">About</a></li>
        <li class="nav-item"><a asp-area="" asp-controller="Home" asp-action="Contact" class="nav-link">Contact</a></li>
    </ul>
    <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
        <ul class="nav navbar-nav navbar-right">
            <li class="nav-item">
                <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage" class="nav-link">Hello @UserManager.GetUserName(User)!</a>
            </li>
            <li class="nav-item">
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Logout</button>
            </li>
        </ul>
    </form>
}
else if (SignInManager.IsSignedIn(User) && showAll == false)
{
    <ul class="nav navbar-nav mr-auto">
        <li class="nav-item"><a asp-area="" asp-controller="Home" asp-action="Index" class="nav-link">Home</a></li>
        <li class="nav-item"><a asp-area="" asp-controller="Home" asp-action="About" class="nav-link">About</a></li>
    </ul>
    <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
        <ul class="nav navbar-nav navbar-right">
            <li class="nav-item">
                <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage" class="nav-link">Hello @UserManager.GetUserName(User)!</a>
            </li>
            <li class="nav-item">
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Logout</button>
            </li>
        </ul>
    </form>
}
else
{
    <ul class="nav navbar-nav mr-auto">
        <li class="nav-item"><a asp-area="" asp-controller="Home" asp-action="Index" class="nav-link">Home</a></li>
    </ul>

    <ul class="nav navbar-nav navbar-right">
        <li class="nav-item"><a asp-area="Identity" asp-page="/Account/Register" class="nav-link">Register</a></li>
        <li class="nav-item"><a asp-area="Identity" asp-page="/Account/Login" class="nav-link">Login</a></li>
    </ul>
}

1 个答案:

答案 0 :(得分:1)

这很大程度上取决于该变量背后的逻辑。如果您可以仅从部分登录中解决该问题,那么当然可以在其中添加逻辑。例如,您可以查看当前路线来确定您是否希望该值为true。

您还可以构建自己的服务,然后将其注入其中,其中包含逻辑。如果您最终要做更复杂的事情,这可能会很有用,因为通常应尽量避免在视图内部添加太多逻辑。

如果该值是在Partial之外设置的,则也可以仅使用ViewData字典进行设置。这将允许您在控制器中设置值,然后局部视图可以只检索该值。像这样:

@{
    bool showAll = false; // default
    if (ViewData.TryGetValue("NavigationShowAll", out var value) && value is bool)
    {
        showAll = (bool)value;
    }
}

然后,在您的控制器中,您可以执行以下操作:

public IActionResult DoSomething()
{
    ViewData["NavigationShowAll"] = true;

    return View();
}
相关问题