Mvc 5,.Net 4.5
我按如下方式实现MvcSiteMapNodeAttribute:
Right
我需要从多个位置访问此页面并保持面包屑的大头钉(即来自正确的调用方法)。但是, ParentKey 指示调用的来源,从而根据它设置 ParentNode 。这并不理想,因为我希望调用ActionResult成为父级而不是"硬编码"与ParentKey解决方案一样。 ParentKey在运行时也不可编辑,也不是ParentNode。目前解决这个问题的唯一方法是复制具有不同签名的ActionResult并给它相同的标题,这也是不理想的。
我已经读过mvc路由,DynamicNodeProvider,路由映射等,但是找不到让这个工作的方法?我对mvc也不太熟悉,所以会很感激一些指导。
由于
答案 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。