1

我遇到以下问题。我设置了 MVC SiteMap,但有一个节点需要保存(保留)参数。从技术上讲,问题解释:

我有路线:Agent/Checklists/Templates,从那里我打开特定模板,Agent/Checklists/EditTemplate/1(其中 1 是 id)然后从那里我打开新页面,即 Agent/Processes/Add

在最后一页我有面包屑:模板>编辑模板>添加进程

现在,当我单击编辑模板时,我希望将我重定向到 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>

谢谢

4

1 回答 1

1

保留的路由参数从当前请求中保留。因此,每个路由键在同一节点祖先中必须是唯一的。换句话说,在使用时,preservedRouteParameters您不能再id为不同的目的(不同的实体)重复使用。

使用preservedRouteParametersid路由值将仅适用于一个级别。如果您嵌套的级别比这更深,您将需要为每个级别创建一个唯一的路由键。

而且您确实需要确保为每个祖先保留父节点的参数,否则 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

于 2017-03-04T22:06:03.870 回答