ASP.net MVC рдореЗрдВ MvcSiteMapProvider рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ

ASP.net MVC рдореЗрдВ MvcSiteMapProvider рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ

рдпрд╣ рдЖрд▓реЗрдЦ рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП MvcSiteMapProvider рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╕рд╛рдЗрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ "рдмреНрд░реЗрдбрдХреНрд░рдВрдм" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдореИрдВ MVC рд╕рдВрдЧреАрдд рд╕реНрдЯреЛрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ MvcSiteMapProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред

рд╕рд╛рдЗрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ
рдШрд░
рджреБрдХрд╛рди
рдЪрдЯреНрдЯрд╛рди
рдХрд╛рдо рдкрд░ рдкреБрд░реБрд╖реЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдкрд░ рдкреБрд░реБрд╖реЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛
рд░реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЖрдкрдХреЛ рд╕рд▓рд╛рдо рдХрд░рддреЗ рд╣реИрдВ
рдХреНрд▓рд╛рд╕рд┐рдХ
рдЬрд╛рдЬ
...
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ

MvcSiteMapProvider рдХреЗ рд╕реНрд░реЛрдд Github , MS-PL рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкрд░ рд╣реИрдВред
рдирдЧреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ (рджреЗрдЦреЗрдВ-> рдЕрдиреНрдп рд╡рд┐рдВрдбреЛ-> рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХ рдХрдВрд╕реЛрд▓)
 PM> рдЗрдВрд╕реНрдЯреЙрд▓-рдкреИрдХреЗрдЬ MvcSiteMapProvider

рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рджреГрд╢реНрдп / рд╕рд╛рдЭрд╛ / рдкреНрд░рджрд░реНрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рджреГрд╢реНрдп рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ * .ascx рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдореЗрдВ Mvc.sitemap рдФрд░ MvcSiteMapSchema.xsd рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ web.config рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛:
<siteMap defaultProvider="MvcSiteMapProvider" enabled="true"> <providers> <clear /> <add name="MvcSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" siteMapFile="~/Mvc.Sitemap" securityTrimmingEnabled="true" cacheDuration="5" enableLocalization="true" scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" excludeAssembliesForScan="" attributesToIgnore="visibility" nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider" /> </providers> </siteMap> </code> 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Mvc.sitemap рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 <?xml version="1.0" encoding="utf-8" ?> <mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd" enableLocalization="true"> <mvcSiteMapNode title="Home" controller="Home" action="Index"> <mvcSiteMapNode title="About" controller="Home" action="About"/> </mvcSiteMapNode> </mvcSiteMap> 

рд╕рд╛рдЗрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдореБрдЦреНрдп рддрддреНрд╡ mvcSiteMapNode xml рддрддреНрд╡ рд╣реИред рдЗрд╕рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝реЗ рд╣реИрдВ:
 <?xml version="1.0" encoding="utf-8" ?> <mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd" enableLocalization="true"> <mvcSiteMapNode title="Home" controller="Home" action="Index"> <mvcSiteMapNode title="Store" controller="Store" action="Index"> </mvcSiteMapNode> <mvcSiteMapNode title="Cart" controller="ShoppingCart" action="Index" /> <mvcSiteMapNode title="Admin" controller="StoreManager" action="Index" > </mvcSiteMapNode> </mvcSiteMapNode> </mvcSiteMap> 


рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ 4 рдореБрдЦреНрдп рдкреГрд╖реНрда рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рдЕрдм рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ рдореИрдк рдореЗрдВ рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рдПрд▓реНрдмрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдЧрддрд┐рд╢реАрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрд▓реНрдмрдо рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╕рд╛рдЗрдЯ рдХрд╛ рдирдХреНрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MvcSiteMapProvider рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдиреЛрдбрдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рд╣реИред рддреЛ, рдЪрд▓реЛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ рдЬреЛ рдХрд┐ DynamicNodeProviderBase рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ GetDynamicNodeCollection рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 public class StoreDynamicNodeProvider : DynamicNodeProviderBase { public MusicStoreEntities _db = new MusicStoreEntities(); public override IEnumerable<DynamicNode> GetDynamicNodeCollection() { var nodes = new List<DynamicNode>(); var items = _db.Genres.ToList(); foreach (var item in items) { DynamicNode node = new DynamicNode(); //        node.Key = "store_" + item.GenreId.ToString(); node.RouteValues.Add("genre", item.Name); node.Action = "Browse"; node.Controller = "Store"; node.Title = item.Name; nodes.Add(node); if (item.Albums!=null) { foreach (var item2 in item.Albums) { DynamicNode node2 = new DynamicNode(); node2.Key = "album_" + item2.AlbumId.ToString(); node2.ParentKey = node.Key; node2.RouteValues.Add("id", item2.AlbumId); node2.Action = "Details"; node2.Controller = "Store"; node2.Title = item2.Title; nodes.Add(node2); } } } return nodes; } } 


рдЕрдм рдЖрдкрдХреЛ Mvc.sitemap рдореЗрдВ рд╕реНрдЯреЛрд░ рдиреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 <mvcSiteMapNode title="Store" controller="Store" action="Index"> <mvcSiteMapNode title="" controller="Store" action="Index" dynamicNodeProvider="MvcMusicStore.Infrastructure.StoreDynamicNodeProvider, MvcMusicStore"/> </mvcSiteMapNode> 


рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдбрд╛рдпрдирд╛рдореЗрдиреЛрдбрдкреНрд░реЛрдЗрдбрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ, рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдиреЛрдбреНрд╕ рдХреЗ рдЬрдирд░реЗрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдореЗрдиреВ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдЬреЛрдбрд╝реЗрдВ
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреГрд╢реНрдп / рд╕рд╛рдЭрд╛ / _Layout.cshtml рдЬреЛрдбрд╝реЗрдВ:
  <div style="text-align: center;">  : @Html.MvcSiteMap().SiteMapPath() </div> @Html.MvcSiteMap().Menu(2, 1) 


рдЕрдм рдмрд╛рдПрдВ рдореЗрдиреВ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреГрд╢реНрдп / рд╕рд╛рдЭрд╛ / рдбрд┐рд╕реНрдкреНрд▓реЗрдЯреЗрдореНрдкрд▓реЗрдЯ / рдореЗрдиреВрд╣реЗрд▓реНрдкрд░ рдореЛрдбрд▓.рдХреНрд▓реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 <ul id="menu"> @foreach (var node in Model.Nodes) { <li style="@(node.IsInCurrentPath && !node.IsRootNode ? "text-decoration: underline;" : "")"> <a href="@node.Url">@node.Title</a> </li> } </ul> 

рдЖрдкрдХреЛ рдирд┐рдореНрди рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:


рд╣рдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╛рдЗрдЯ рдкрд░ рдХреЗрд╡рд▓ рдкрде рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ, рд▓реЗрдХрд┐рди рдмрд╛рдИрдВ рдУрд░ рдореЗрдиреВ рдирд╣реАрдВ рд╣реИред
рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рдЗрд╕реА рддрд░рд╣ рд╕реНрдЯреЛрд░ рд╕реЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдбрд╛рдпрдиреЗрдорд┐рдХрдиреЛрдбрдкреНрд░реЛрд╡рд╛рдЗрдбрд░рдмреЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВред

 public class AdminDynamicNodeProvider : DynamicNodeProviderBase { public MusicStoreEntities _db = new MusicStoreEntities(); public override IEnumerable<DynamicNode> GetDynamicNodeCollection() { var nodes = new List<DynamicNode>(); var items = _db.Albums.ToList(); foreach (var item in items) { var node=new DynamicNode() { Key="admin_album_edit_"+ item.AlbumId.ToString(), Action="Edit", Controller="StoreManager", Title="  "+item.Title }; node.RouteValues.Add("id", item.AlbumId); nodes.Add(node); node = new DynamicNode() { Key = "admin_album_delete_" + item.AlbumId.ToString(), Action = "Delete", Controller = "StoreManager", Title = "  " + item.Title }; node.RouteValues.Add("id", item.AlbumId); nodes.Add(node); node = new DynamicNode() { Key = "admin_album_details_" + item.AlbumId.ToString(), Action = "Details", Controller = "StoreManager", Title = "  " + item.Title }; node.RouteValues.Add("id", item.AlbumId); nodes.Add(node); } return nodes; } } 


рдЗрд╕реА рддрд░рд╣, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдиреЛрдб рдмрджрд▓реЗрдВ:
 <mvcSiteMapNode title="Admin" controller="StoreManager" action="Index" > <mvcSiteMapNode title="" controller="StoreManager" action="Index" dynamicNodeProvider="MvcMusicStore.Infrastructure.AdminDynamicNodeProvider, MvcMusicStore"/> <mvcSiteMapNode title="Create" controller="StoreManager" action="Create" /> </mvcSiteMapNode> 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдХрд▓реЗрдЧрд╛:


рд╣рдореЗрдВ рдореЗрдиреВ рдореЗрдВ рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрдЯ рдкрд░ рдкрде рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Mvc.sitemap рдЖрд╡рд╢реНрдпрдХ nodah рдРрдб рд╡рд┐рд╢реЗрд╖рддрд╛ рджреГрд╢реНрдпрддрд╛ = ┬лSiteMapPathHelper ,! *┬╗ , рдФрд░ рдпрд╣ рдХрд╛рдо рдЕрдиреБрднрд╛рдЧ рдЬрд╣рд╛рдВ ┬лMvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider┬╗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдореВрд▓реНрдп Mvc.sitemap рдкрд░рд┐рд╡рд░реНрддрди siteMapNodeVisibilityProvider рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ web.config рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
Mvc.sitemap рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг:
 <?xml version="1.0" encoding="utf-8" ?> <mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd" enableLocalization="true"> <mvcSiteMapNode title="Home" controller="Home" action="Index" visibility=""> <mvcSiteMapNode title="Store" controller="Store" action="Index"> <mvcSiteMapNode title="" controller="Store" action="Index" dynamicNodeProvider="MvcMusicStore.Infrastructure.StoreDynamicNodeProvider, MvcMusicStore"/> </mvcSiteMapNode> <mvcSiteMapNode title="Cart" controller="ShoppingCart" action="Index" /> <mvcSiteMapNode title="Admin" controller="StoreManager" action="Index" > <mvcSiteMapNode title="" controller="StoreManager" action="Index" visibility="SiteMapPathHelper,!*" dynamicNodeProvider="MvcMusicStore.Infrastructure.AdminDynamicNodeProvider, MvcMusicStore"/> <mvcSiteMapNode title="Create" controller="StoreManager" visibility="SiteMapPathHelper,!*" action="Create" /> </mvcSiteMapNode> </mvcSiteMapNode> </mvcSiteMap> 


рдЕрдм рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:


рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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


All Articles