Родительские параметры MVC SiteMap не сохранены

У меня возникла следующая проблема. Я устанавливаю MVC SiteMap, но есть узел, который мне нужен для сохранения (сохранения) параметра. Технически проблема объясняется:

У меня есть маршрут: агент / контрольные списки / шаблоны, оттуда я открываю конкретный шаблон, агент / контрольные списки /EditTemplate/1 (где 1 - идентификатор), а затем оттуда я открываю новую страницу, которая является агентом / процессами / добавить

На последней странице у меня есть хлебные крошки: Шаблоны> Редактировать шаблон> Добавить процесс

И теперь я хочу, когда я нажимаю на Редактировать шаблон, чтобы перенаправить меня в Agent/Checklists/EditTemplate/1

Я попытался поместить декоратор SiteMapPreserveRouteData в Action, но он говорит, что он устарел.

Вот мой Mvc.sitemap

<mvcSiteMapNode title="Templates" controller="Checklists" action="Templates" area ="Agent">
        <mvcSiteMapNode title="Edit Template" controller="Checklists" action="EditTemplate" area="Agent" preservedRouteParameters="id">
          <mvcSiteMapNode title="Add Process" controller="Processes" action="Add" area="Agent" preservedRouteParameters="id, id" />
          <mvcSiteMapNode title="Process Configuration" controller="Processes" action="Edit" area="Agent" preservedRouteParameters="token" />
        </mvcSiteMapNode>
      </mvcSiteMapNode>

Спасибо

1 ответ

Сохраненные параметры маршрута сохраняются из текущего запроса. Следовательно, каждый ключ маршрута должен быть уникальным в пределах одного и того же узла. Другими словами, при использовании preservedRouteParameters вы не можете использовать повторно id снова для другой цели (другой объект).

С помощью preservedRouteParameters, id Значение маршрута будет работать только для одного уровня. Если вы вложите уровни глубже, вам нужно будет создать уникальный ключ маршрута для каждого уровня.

И вам нужно убедиться, что вы сохраняете параметры родительского узла для каждого предка, иначе URL будет создан неправильно.

<mvcSiteMapNode title="Templates" controller="Checklists" action="Templates" area="Agent">
    <mvcSiteMapNode title="Edit Template" controller="Checklists" action="EditTemplate" area="Agent" preservedRouteParameters="checklistId">
        <mvcSiteMapNode title="Add Process" controller="Processes" action="Add" area="Agent" preservedRouteParameters="processId,checklistId" />
        <mvcSiteMapNode title="Process Configuration" controller="Processes" action="Edit" area="Agent" preservedRouteParameters="token,processId,checklistId" />
    </mvcSiteMapNode>
</mvcSiteMapNode>

Простой способ справиться с этим - добавить маршрут на контроллер.

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Checklists",
            "Checklists/{action}/{checklistId}",
            new { controller = "Checklists", action = "Index", checklistId = UrlParameter.Optional });

        routes.MapRoute(
           "Processes",
           "Processes/{action}/{processId}",
           new { controller = "Processes", action = "Index", processId = UrlParameter.Optional });

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Затем вам нужно добавить данные предков к каждому URL.

@Html.ActionLink("Edit Process", "Edit", "Process", new { token = "1234", processId = "5678", checklistId = "23" } , null)

Посмотрите эти демонстрации для примеров использования обоих preservedRouteParameters и провайдеры динамических узлов.

Другие вопросы по тегам