针对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作了简单的研究,更高级的应用有待后续学习、补充。

  •    实例代码下载

    你可能感兴趣的:(Provider)