我有以下问题。我设置了MVC站点地图,但是有一个节点我需要保存(保存)参数。从技术上讲,问题解释了:
我有路由:代理/清单/模板,从那里我打开特定模板,代理/清单/deDittemplate/1(其中1是ID)然后从那里打开新页面,即代理/process/add
在最后一页中,我有面包屑:模板>编辑模板>添加过程
现在,当我单击编辑模板时,我想要将我重定向到代理/清单/edittemplate/1
我尝试将SiteMappReserverOutEdata Decorator放在动作上,但说它已经过时了。
这是我的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>
谢谢
保留的路由参数从当前请求保留。因此,每个路由密钥必须在同一节点祖先中是唯一的。换句话说,使用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
和动态节点提供商的示例,请参见这些演示。