我一直试图使它起作用,但似乎不起作用。基本上,我需要一个动态导航栏。预先构建的.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>
}
答案 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();
}