Mvcsitemapprovider到单个页面的多个路径

我想让breadcrump导航到同一页面的3条路径。 站点地图位于底部。

         

我尝试使用属性“类型”和“密钥”,但它没有帮助。 每次当我打开动作ActionDetails时,breadcrump看起来像root> Finished> Action

根据模型的状态在控制器中确定路径的选择。 我现在应该编写自己的DynamicNodeProvider,但我不知道如何从controler将参数传递给Provider。 我无法使用动作注释,因为我现在的动作体模型就像在底部:

 public ActionResult ActionTabDetails(Guid actionTabGuid) { ActionTab model = actionTabRepo.Get(actionTabGuid, "ActionGroup"); if (model.Status == ActionStatus.New) { //Parameter with I want to pass to the DynamicNodeProvider or select current node } //another conditions return View("ActionTab/ActionTabDetails", model); } 

我试过了:

 SiteMap.CurrentNode = SiteMap.Provider.FindSiteMapNodeFromKey("new"); 

但在控制器中只是吸气剂。

我会非常感激你的帮助。

更新:

我用可选参数做了动作:

 public ActionResult ActionTabDetails(Guid actionTabGuid, int actionStatus=0) 

但每个url都喜欢

  • /推广/操作/动作?actionTabGuid = 822ed729-8edd-4301-970a-867d2b4f9246
  • /促销/操作/动作?actionTabGuid = 822ed729-8edd-4301-970a-867d2b4f9246&actionStatus = 1
  • /促销/操作/动作?actionTabGuid = 822ed729-8edd-4301-970a-867d2b4f9246&actionStatus = 2

直接到没有参数的第一个节点。 我已尝试使用obvers参数进行操作,但效果仍然相同。 我将感激不尽。

使其工作的关键是要知道每一组路由值在SiteMap中必须是唯一的。 也就是说,您需要向除1个路由之外的所有路由添加另一个参数,并且每个节点上的参数名称或其值必须不同。

          

路由值(或url属性上设置的显式URL)的组合是如何将节点标识为当前节点并且第一个匹配总是获胜。 但是如果添加额外的数据,那么每个节点都将是完全唯一的。

如果您使用的是默认路由,那么您的url将如下所示:

  • /推广/操作/行动
  • /推广/操作/动作?someParameter = 1
  • /推广/操作/动作?someParameter = 2

请注意,如果您愿意,还可以通过inheritanceRouteBase或将自定义参数添加到路由来自定义MVC路由,以使URL更加用户友好。

一旦您按照自己喜欢的方式设置了URL(即UNIQUE URL),就可以使用规范标记HTML帮助程序来确保搜索引擎仅对“主”URL编制索引,而忽略其他URL。 您只需要将canonicalKey或canonicalUrl属性设置为“main”节点的属性。

          

然后,您只需将@Html.MvcSiteMap().CanonicalTag() HTML帮助器添加到布局页面中的HEAD部分,将在备用页面上自动创建规范URL(但不会在“主”页面上创建)。

有关可下载示例,请参阅此post 。 此外, 这篇文章深入探讨了节点匹配function的工作原理。

MVC路由

请记住,确定URL构造方式的路线。 看看你的RouteConfig.cs文件。

 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

如您所见,默认路由仅使用“id”作为参数。 您添加的任何不是控制器,操作或ID的内容都将成为查询字符串的一部分。 您可以根据应用程序的需要添加其他路径,参数和约束(更多特定路由属于默认路由之前,通常您应该单独保留默认路由)。 看看MSDN深入报道路由或谷歌“mvc路由”,你会发现很多很棒的教程。

提示: AttributeRouting通过使用多个Route属性对其进行装饰,可以轻松地为操作方法提供多个路径。

 [Route("new-actions/action-tab-details/{actionTabGuid}")] [Route("continues-actions/action-tab-details/{actionTabGuid}")] [Route("finished-actions/action-tab-details/{actionTabGuid}")] public ActionResult ActionTabDetails(Guid actionTabGuid) { ActionTab model = actionTabRepo.Get(actionTabGuid, "ActionGroup"); if (model.Status == ActionStatus.New) { //Parameter with I want to pass to the DynamicNodeProvider or select current node } //another conditions return View("ActionTab/ActionTabDetails", model); } 

如果你不想弄乱路由,我建议只使用默认路由并使用“id”作为你的Guid值(因为大多数动作只会有一个)。 如果对您的应用程序没有任何意义,并且您的路由未将其指定为必需值(默认路由不是),则无需在操作方法中添加“actionStatus”。

MvcSiteMapProvider路由

另一方面是MvcSiteMapProvider的节点匹配。 使用自定义路由值(参数)时,您需要配置MvcSiteMapProvider,以便它了解您正在使用自定义参数。 您可以通过将它们的每个可能组合添加为单独的节点(使用IDynamicNodeProvider或ISiteMapNodeProvider)来执行此操作,或者您需要强制每个值与具有savedRouteParameters的单个节点匹配。 如果所有页面都在搜索引擎中编制索引很重要,请为每个值使用单个节点。 如果您的页面主要用于数据输入,请使用savedRouteParameters。 通常,在使用savedRouteParameters时,您还必须使用SiteMapTitleAttribute和可见性提供程序来调整菜单和痕迹路径的外观。 这篇文章中有两种技术可供下载。