как реализовать параметры маршрута в навигационной крошке в облачной навигации?

Я использую облачную навигацию для создания боковой панели и связанного с ней меню хлебных крошек

Я не смог найти его в справочной документации, поэтому разместите здесь

у нас есть некоторые параметры маршрута в наших шаблонах маршрутизации - я не уверен, как сохранить их в хлебных крошках, параметр навигации сохраненRouterParameters Я понимаю, что работает только с параметрами строки запроса

наш маршрут выглядит примерно так:

{wholesaleCustomerCode} / {area: exists} / {baseItemId: guid} / {controller = Home} / {action = Index} / {id: guid?}

и будет переводиться примерно так:

http://127.0.0.1:5100/TOM/Service/09185d87-5e3f-4217-a0b9-02f766efc714/Home/Detail

теперь, когда я нахожусь в представлении / Detail - он вложен довольно глубоко - но предыдущий родительский элемент в хлебной крошке теряет значение baseItemId - какие-либо предложения, как я могу сохранить параметры маршрута в иерархии хлебных крошек?

Я попытался сделать следующее, просто чтобы проверить, подберет ли он параметры сохранения маршрута, но не сработало

<Children>
                    <NavNode
                    key="d902daaa-99ec-488a-85de-c03641fb547d"
                    area="Service"
                    controller="Home"
                    action="Detail"
                    text="Service"
                    iconCssClass=""
                    componentVisibility="breadcrumbs"
                    viewRoles="Administrator"
                    preservedRouteParameters="baseItemId"
                    >
                        <Children>
                            <NavNode
                            key="3047c57d-0f8c-4875-aff9-9c1f91909e41"
                            area="Service"
                            controller="RecurringCredit"
                            action="Edit"
                            text="Recurring Credit"
                            iconCssClass=""
                            componentVisibility="breadcrumbs"
                            viewRoles="Administrator"
                            preservedRouteParameters="baseItemId"
                            >
                            </NavNode></Children></NavNode>

person Danish    schedule 02.11.2017    source источник


Ответы (2)


Это правда, что savedRouteParameters работает только для параметров строки запроса. Одно из возможных решений - использовать код из действия контроллера для подробного представления, чтобы при необходимости обновить URL-адрес родительских хлебных крошек. Соответствующая документация здесь: https://www.cloudscribe.com/docs/adjusting-menu-items-per-request

var crumbAdjuster = new NavigationNodeAdjuster(Request.HttpContext);
crumbAdjuster.KeyToAdjust = "d902daaa-99ec-488a-85de-c03641fb547d";
crumbAdjuster.AdjustedUrl = // set the url here as you want it to be;
crumbAdjuster.AddToContext();

который обновит URL-адрес для данного узла меню в течение срока действия текущего запроса

person Joe Audette    schedule 02.11.2017
comment
решение на самом деле не сработает для нас, у нас есть много контроллеров, которые вызываются через этот шаблон маршрута, это также подразумевает жесткое кодирование действий для клавиш меню Я сделаю быструю оценку, чтобы увидеть, возможно ли форкнуть и добавить функциональность в - спасибо, Джо, можете ли вы также рассматривать это как запрос функции :) - person Danish; 03.11.2017

Вот как я решил проблему

Предположим, у вас есть следующее представление BootstrapBreadcrumbs по умолчанию из cloudscribe.Web.Navigation / Views:

@using cloudscribe.Web.Navigation
@model NavigationViewModel
@if (Model.CurrentNode != null && (Model.ParentChain.Count > 1 || (Model.TailCrumbs != null && Model.TailCrumbs.Count > 0)))
{
    <ul class="breadcrumb">
    @foreach (var node in Model.ParentChain)
    {
        if (!Model.ShouldAllowView(node)) { continue; }
        if (node.EqualsNode(Model.CurrentNode))
        {
            if (Model.TailCrumbs != null)
            {
                <li><a href="@Url.Content(Model.AdjustUrl(node))">@Model.AdjustText(node)</a><span class="divider"></span></li>
            }
            else
            {
                <li class="active">@Model.AdjustText(node)</li>
            }
        }
        else
        {
            <li><a href="@Url.Content(Model.AdjustUrl(node))">@Model.AdjustText(node)</a><span class="divider"></span></li>
        }
    }
    @if (Model.TailCrumbs != null)
    {
        foreach (var n in Model.TailCrumbs)
        {
            <li class="active">@n.Text</li>
        }
    }
    </ul>
}

вместо использования Model.AdjustUrl обойти его в пользу использования помощника asp-route- *

@using cloudscribe.Web.Navigation
@model NavigationViewModel
@{
    var id = ViewContext.RouteData.Values["id"];
    var baseItemId = ViewContext.RouteData.Values["baseItemId"];
    var orderId = ViewContext.HttpContext.Request.Query["orderId"];
}

@if (Model.CurrentNode != null && (Model.ParentChain.Count > 1 || (Model.TailCrumbs != null && Model.TailCrumbs.Count > 0)))
{
    <ul class="breadcrumb">
    @foreach (var node in Model.ParentChain)
    {
        if (!Model.ShouldAllowView(node)) { continue; }
        if (node.EqualsNode(Model.CurrentNode))
        {
            if (Model.TailCrumbs != null)
            {
                <li><a asp-area="@node.Value.Area" asp-controller="@node.Value.Controller" asp-action="@node.Value.Action" asp-route-baseItemId="@baseItemId" asp-route-orderId="@orderId" asp-route-id="@id">
                    @Model.AdjustText(node)
                    </a>
                    <span class="divider"></span>
                </li>
            }
            else
            {
                <li class="active">@Model.AdjustText(node)</li>
            }
        }
        else
        {
            <li><a asp-area="@node.Value.Area" asp-controller="@node.Value.Controller" asp-action="@node.Value.Action" asp-route-baseItemId="@baseItemId" asp-route-orderId="@orderId" asp-route-id="@id">@Model.AdjustText(node)</a><span class="divider"></span></li>
        }
    }
    @if (Model.TailCrumbs != null)
    {
        foreach (var n in Model.TailCrumbs)
        {
            <li class="active">@n.Text</li>
        }
    }
    </ul>
}

эта реализация имеет некоторые недостатки и может не работать для всех - например, все предыдущие иерархии хлебных крошек теперь имеют baseItemId в маршруте - например,

приборная панель / все примечания / примечание / подробности

здесь ко всем заметкам также будет добавлен baseItemId, хотя он ему и не нужен -

но это работает для нас, поскольку это административный портал (без требований к SEO) и способ отображения наших шаблонов маршрутов

person Danish    schedule 03.11.2017