mvcsitemapprovider - 从不同的页面导航到相同的ActionResult

时间:2016-07-01 12:00:28

标签: c# asp.net-mvc sitemap breadcrumbs mvcsitemapprovider

Mvc 5,.Net 4.5

我按如下方式实现MvcSiteMapNodeAttribute:

Right

我需要从多个位置访问此页面并保持面包屑的大头钉(即来自正确的调用方法)。但是, ParentKey 指示调用的来源,从而根据它设置 ParentNode 。这并不理想,因为我希望调用ActionResult成为父级而不是"硬编码"与ParentKey解决方案一样。 ParentKey在运行时也不可编辑,也不是ParentNode。目前解决这个问题的唯一方法是复制具有不同签名的ActionResult并给它相同的标题,这也是不理想的。

我已经读过mvc路由,DynamicNodeProvider,路由映射等,但是找不到让这个工作的方法?我对mvc也不太熟悉,所以会很感激一些指导。

由于

1 个答案:

答案 0 :(得分:1)

请参阅Multiple Navigation Paths to a Single Page文档。

您可以在多个位置使用相同的控制器操作。但是,您必须始终提供一组唯一的路由值(通常意味着每个URL都应该是唯一的)。

最自然的方法是使用父类别设计您的网址。

routes.MapRoute(
    name: "Category1RunningEvents",
    url: "Category1/RunningEvents",
    defaults: new { controller = "Events", action = "RunningEvents", category="Category1" }
);

routes.MapRoute(
    name: "Category2RunningEvents",
    url: "Category2/RunningEvents",
    defaults: new { controller = "Events", action = "RunningEvents", category="Category2" }
);

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

然后通过category字段区分路由匹配。您可以在同一操作中使用多个MvcSiteMapNode属性,每个属性在SiteMap中都有不同的父键。

[MvcSiteMapNode(Title="Category 1 Events", ParentKey="Events", Key="RunningEvents", Attributes = @"{ ""category"": ""Category1"" }")]
[MvcSiteMapNode(Title="Category 2 Events", ParentKey="Category2", Key="Category2RunningEvents", Attributes = @"{ ""category"": ""Category2"" }")]
public ActionResult RunningEvents()
{
    return View();
}

当然,这不是配置路由的唯一方法,但它应该清理这个概念。唯一的限制是必须为匹配使用一组唯一的路由值,每个路由值对应一个节点。但是,可以是表示相同控制器操作的多个节点,每个节点都有不同的父节点。

另见this answer