簡體   English   中英

在ASP.NET Core 2.1中,如何在用戶基於角色登錄后添加菜單項?

[英]In ASP.NET Core 2.1 how do I add menu items after the user has logged in based on Role?

我有一個Razor Web應用程序,其中定義了幾個自定義AspNetRoles。 我希望一個或多個菜單項僅在用戶登錄后才顯示,並且如果它們是我在PageModel類的Authorize標記中指定的Role的成員。 我在想可以使用單獨的版式,但無法正常使用。 還有其他想法嗎?

當前的_Layout.cshtml包含以下內容:

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a asp-page="/Index" class="navbar-brand">@Configuration["Agency:AgencyName"] Agency</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a asp-page="/ClientManagement/Index">About</a></li>
                <li><a asp-page="/About">About</a></li>
                <li><a asp-page="/Contact">Contact</a></li>
            </ul>
            @await Html.PartialAsync("_LoginPartial")
        </div>
    </div>
</nav>

我只希望在具有特定角色的用戶登錄后出現ClientManagement / Index菜單項。

在對@await Html.PartialAsync(“ _ LoginPartial”)代碼的工作方式進行了一些研究之后,我找到了一種實現所需功能的方法。 在下面的代碼中,我首先通過_LoginPartial.cshtml文件驗證用戶是否已登錄。然后,檢查用戶是否具有特定角色。 如果用戶處於指定的角色中,則我發出該角色所需的標記。

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
<form asp-controller="Account" asp-action="Logout" method="post" id="logoutForm" class="navbar-right">
    <ul class="nav navbar-nav navbar-right">
        <li>
            <a asp-page="/ScheduleManagement/Scheduling">Schedule Shifts</a>
        </li>
        @if (User.IsInRole("AgencyAdministrator"))
        {
            <li>
                <a asp-page="/ClientManagement/Index">Client Management</a>
            </li>
            <li>
                <a asp-page="/ProjectManagement/Index">Project Management</a>
            </li>
            <li>
                <a asp-page="/ShiftEmployeeManagement/Index">Shift Employee Management</a>
            </li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Types Management<span class="caret"></span></a>
                <ul class="dropdown-menu">
                    <li>
                        <a asp-page="/TypeManagement/AddressType/Index">Address Type Management</a>
                    </li>
                    <li>
                        <a asp-page="/TypeManagement/DomainTypes/Index">Domain Type Management</a>
                    </li>
                    <li>
                        <a asp-page="/TypeManagement/EmailType/Index">Email Type Management</a>
                    </li>
                    <li>
                        <a asp-page="/TypeManagement/SkillLevelType/Index">Skill Level Type Management</a>
                    </li>
                    <li>
                        <a asp-page="/TypeManagement/SkillType/Index">Skill Type Management</a>
                    </li>
                </ul>
            </li>
        }
        <li>
            <a asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
        </li>
        <li>
            <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
        </li>
    </ul>
</form>
}
else
{
<ul class="nav navbar-nav">
    <li><a asp-page="/About">About</a></li>
    <li><a asp-page="/Contact">Contact</a></li>
</ul>
}

這確實顯示了DI的強大功能,因為我因此只能訪問SignInManager和UserManager。

無論如何,我敢肯定,還有其他方法可以完成我想要的工作,根據用戶或用戶角色顯示界面項,但這確實可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM