针对ASP.NET MVC的site map ASP.NET MVC SiteMap provider

   使用过传统asp.net form的开发人员都知道,asp.net中提供了一个sitemap功能,能够方便的生成导航菜单或者导航链接,仅需要通过配置即可实现对导航链接的管理。对于site map的配置以及使用,基本上主流的asp.net教材都有典型的例子,比如如何使用site map datasource时,如何配置xml格式sitemap等等。而作为asp.net的新模式应用 asp.net mvc似乎没有内置的实现sitemap的功能,当然理论上还是可以写硬编码一些相对路径到节点中,但是毕竟不能很好的跟mvc中controller和action结合在一起,毕竟sitemap出来的时候还没有mvc呢。不过作为.net的框架,历来都是提供了良好的扩展性,经典的策略模式也同样被应用在sitemap的应用中,仅仅需要实现自己的provider即可。

   最近在codeplex上就看到了一款针对asp.net开发的sitemap provider,不仅附带了源码,还展示了如何应用在实例中。实例采用的一个入门级的mvc应用程序MvcMusicStore,确实比较潮,得装了vs2010才能跑起来。经过一番简单研究之后,终于有了些眉目,效果还算满意。具体的实现方式如下:

   第一步:

   到http://mvcsitemap.codeplex.com/下载最新的dll,最好连带sample也一起下载,跑起来比较费劲,但研究一下经典的入门样例也不赖。

   第二步:

   在web.config中配置sitemap节点,配置方式在官网有详细的介绍,主要是提供一个provider,设置一下属性即可,开起来比较多,其实可以省略不少的

siteMap 配置
        <siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
            
<providers>
                
<clear/>
                
<add name="MvcSiteMapProvider"
                 type
="MvcSiteMapProvider.DefaultSiteMapProvider,MvcSiteMapProvider"
                 siteMapFile
="~/Web.Sitemap"
                 securityTrimmingEnabled
="true"
                 cacheDuration
="5"
                 enableLocalization
="true"
                 scanAssembliesForSiteMapNodes
="true"
                 skipAssemblyScanOn
=""
                 attributesToIgnore
="bling,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>

   第三步:

   创建sitemap文件,新建方式跟传统的一样,要更改的只是内容。文件名要跟web.config中配置的一样,这里是Web.sitemap。典型的xml级联配置方式,当然需要了解各个属性的含义以及方式,比如title为标题,controll、action等就不用说了,官网有详细的配置说明

sitemap文件
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-2.0" enableLocalization="true">
    
<mvcSiteMapNode title="首页" controller="Home" action="Index" changeFrequency="Always" updatePriority="Normal">
        
<mvcSiteMapNode title="关于" controller="Home" action="About"/>
        
<mvcSiteMapNode title="登录" controller="Account" action="LogOn"/>
        
<mvcSiteMapNode title="注册" controller="Account" action="Register"/>
        
<mvcSiteMapNode title="产品" controller="Product" action="Index">
            
<mvcSiteMapNode title="产品明细" dynamicNodeProvider="MvcSiteMapDemp.ProductDetailsDynamicNodeProvider, MvcSiteMapDemp"/>
        
</mvcSiteMapNode>
    
</mvcSiteMapNode>
</mvcSiteMap>

   第四步:

   完了之后,配置方面的工作基本完成。接下来是如何去应用的问题。mvc sitemap provider中提供了调用的api,通过扩展htmlhelper的方式提供了展现的方式,主要有以下方式(引用官网的描述)

  • Html.MvcSiteMap().Menu() - Can be used to generate a menu
  • Html.MvcSiteMap().SiteMap() - Can be used to generate a list of all pages in your sitemap
  • Html.MvcSiteMap().SiteMapPath() - Can be used to generate a so-called "breadcrumb trail"
  • Html.MvcSiteMap().SiteMapTitle() - Can be used to render the current SiteMap node's title  

    以上步骤完成之后,基本上可以得到类似如下格式的导航菜单

    首页 > 产品 > 产品2

       当然我们一般的页面可以用这种简单方式配置,如果涉及动态显示,如本例中的产品明细节点,那么需要实现自己的生成节点的方式, 即实现自己的 dynamicNodeProvider。实现自定义的NodeProvider的方式如下

    DynamicNodeProvider
    public class ProductDetailsDynamicNodeProvider : DynamicNodeProviderBase
        {
            
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
            {
                DynamicNode node1 
    = new DynamicNode();
                node1.Action 
    = "ProductDetails";
                node1.Controller 
    = "Product";
                node1.Title 
    = "产品1";
                node1.RouteValues.Add(
    "name""产品1");

                DynamicNode node2 
    = new DynamicNode();
                node2.Action 
    = "ProductDetails";
                node2.Controller 
    = "Product";
                node2.Title 
    = "产品2";
                node2.RouteValues.Add(
    "name""产品2");

                
    return new DynamicNode[] { node1, node2 };
            }
        }

       以上仅仅是其中的一个扩展点,mvc sitemap provider提供了多个扩展点使得配置更加的灵活。其中在显示方面,如果需要改变显示链接的方式,需要在Views的shared文件夹下新建DisplayTemplates,里面放置自定义的模板,完整的模板可从官网下载得到。

       仅对mvc sitemap provider作了简单的研究,更高级的应用有待后续学习、补充。

  •    实例代码下载

    原文地址:https://www.cnblogs.com/shenba/p/1865203.html