Инициализация навбара в ASP.NET Core MVC

181
22 октября 2018, 20:10

Есть навбар, он идет один на все страницы, нужно чтобы при заходе пользователя с другими правами в навбаре будет изменятся количество и название некоторых ссылок. Как это лучше реализовать?

 <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">Navbar</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav">
            <li class="nav-item active">
                <a class="nav-link" href="#">Главная <span class="sr-only">(current)</span></a>                    
            </li>
               ВСТАВИТЬ СЮДА ЭЛЕМЕНТЫ
            </ul>
    </div>
</nav>
Answer 1

Чем не вариант?

<ul class="nav navbar-nav">
    @Html.Partial("_MenuForEveryone");
    @if (User.IsInRole("Manager"))
    {
        @Html.Partial("_MenuForManager");
    }
    @if (User.IsInRole("Administrator"))
    {
        @Html.Partial("_MenuForAdministrator");
    }
</ul>

Где каждый из подключаемых partial view будет чем-то вида:

<li><a asp-area="Admin" asp-controller="Contact" asp-action="MyContacts">Мои контакты</a></li>
<li><a asp-area="Admin" asp-controller="Contact" asp-action="MyContacts">link2</a></li>

Есть и более сложные варианты, когда вам на ссылки нужно навешивать класс active - это может пригодиться когда у вас на странице табы или дизайнер упёрся и упорно хочет сделать текущую ссылку более хитро подсвеченной.

Я писал для этого небольшой экстеншн:

public static class HtmlHelperExtensions
{
    public static IHtmlContent LiActionLink(this IHtmlHelper helper, string linkText, string actionName, string controllerName, object routeValues)
    {
        var currentAction = helper.ViewContext.RouteData.Values["action"].ToString();
        var currentController = helper.ViewContext.RouteData.Values["controller"].ToString();
        var isCurrentAction = currentAction.Equals(actionName, StringComparison.InvariantCulture) &&
                              currentController.Equals(controllerName, StringComparison.InvariantCulture);
        var li = new TagBuilder("li");
        if (isCurrentAction)
            li.AddCssClass("active");
        var link = helper.ActionLink(linkText, actionName, controllerName, routeValues);
        li.InnerHtml.SetHtmlContent(link);
        var writer = new System.IO.StringWriter();
        li.WriteTo(writer, HtmlEncoder.Default);
        return new HtmlString(writer.ToString());
    }
}

Пользоваться так:

<ul class="nav nav-tabs">
    @Html.LiActionLink("Details", nameof(MyController1.DetailsCurrent), "MyController1", new { id = Model.Contact.Id })
    @Html.LiActionLink("Archieve", nameof(MyController1.DetailsArchieve), "MyController1", new { id = Model.Contact.Id })
</ul>
READ ALSO
Красные галки возле классов и проекта в Visual Studio

Красные галки возле классов и проекта в Visual Studio

Создаю игру в unityПишу скрипты в Visual Studio 2017

170
C# WPF Button.Click дополнительная информация

C# WPF Button.Click дополнительная информация

Как мне передать некую дополнительную информацию, когда происходит событие клика на кнопку? К примеру, существует ListBox, который выводит информацию...

227
Почему в C# такой неудобный enum?

Почему в C# такой неудобный enum?

Есть ли возможность использовать шарповый энум как в плюсах? Вот что я имею ввиду:

177