В ASP.NET Core 2.1 как добавить пункты меню после того, как пользователь вошел в систему на основе роли? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть веб-приложение Razor, в котором определено несколько пользовательских AspNetRoles.Я хочу, чтобы один или несколько элементов меню отображались только после того, как пользователь вошел в систему, и если они являются членами роли, которую я указал в теге Authorize для класса PageModel.Я думаю, что я мог бы использовать отдельный макет, но я не могу заставить это работать.Любые другие идеи?

Текущий _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 отображался только после входа пользователя с определенной ролью.

1 Ответ

0 голосов
/ 15 июня 2018

После небольшого исследования того, как работает код @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 из-за этого.

В любом случае, я уверен, что могут быть другие способы выполнить то, что я хотел, отображая элементы интерфейса на основе роли пользователя или пользователя, но это, безусловно, работает.

...