MvcSiteMapProvider doesn't seem to work with routes that have route values

I am currently using MvcSiteMapProvider to generate my breading dynamically for me

@Html.MvcSiteMap().SiteMapPath()

My site is completely branded, and the first value in Url contains the brand, so my routes all look like this:

routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", Action = "Terms" });
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", Action = "Privacy" });
routes.MapRoute("Home", "{brand}", new { controller = "Home", action = "Dashboard" });
routes.MapRoute("Dashboard", "{brand}/Dashboard", new { controller = "Home", action = "Dashboard" });

This worked somewhat in the previous version, but I saw intermittent problems viewing the same route with two different brands. When I update, I get nothing now.

My site map looks like this:

  <mvcSiteMapNode title="Home" url="/{brand}" route="Home">
    <mvcSiteMapNode title="Dashboard" url="/{brand}/Dashboard" route="Dashboard" />
    <mvcSiteMapNode title="Terms" url="/{brand}/Terms" route="Terms" />
    <mvcSiteMapNode title="Privacy" url="/{brand}/Privacy" route="Privacy" />
  </mvcSiteMapNode>

I dug up the documentation for the update and tried a ton of different things. I included the source in my project and debugged, and the only thing I saw was that no matter what I do, currentNode is always null.

Any ideas?

+4
1

url/ URL- , . url, node URL- node. ASP.NET SiteMap. , URL-, .

MVC , , ActionLink RouteLink ( ).

<mvcSiteMapNode title="Home" controller="Home" action="Dashboard" route="Home">
    <mvcSiteMapNode title="Dashboard" action="Dashboard" route="Dashboard" />
    <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" route="Terms" />
    <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" route="Privacy" />
</mvcSiteMapNode>

, XML node, , . .

<mvcSiteMapNode title="Home" controller="Home" action="Dashboard">
    <mvcSiteMapNode title="Dashboard" action="Dashboard" />
    <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" />
    <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" />
</mvcSiteMapNode>

- , . , .

, , . , , . ( ) , "" RouteParameter, .

<mvcSiteMapNode title="Home" controller="Home" action="Dashboard" preservedRouteParameters="brand">
    <mvcSiteMapNode title="Dashboard" action="Dashboard" preservedRouteParameters="brand"/>
    <mvcSiteMapNode title="Terms" controller="Legal" action="Terms" preservedRouteParameters="brand"/>
    <mvcSiteMapNode title="Privacy" controller="Legal" action="Privacy" preservedRouteParameters="brand"/>
</mvcSiteMapNode>

, node RouteValues ​​ . , ( ) node RouteValues, RouteValues ​​ . , currentNode null.

, , , , , v4.4.x URL-, , .

, , MvcSiteMapProvider .

2

, . "" "", .

// This is what you have
routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", Action = "Terms" });
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", Action = "Privacy" });

// Action should always be lowercase (action)
routes.MapRoute("Terms", "{brand}/Terms", new { controller = "Legal", action = "Terms" });
routes.MapRoute("Privacy", "{brand}/Privacy", new { controller = "Legal", action = "Privacy" });
+3

Source: https://habr.com/ru/post/1526794/


All Articles