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

  •    实例代码下载

查看全文
  • 相关阅读:
    Python学习(二十四)—— 前端基础之Bookstrap
    Python学习(二十三)—— 前端基础之jQuery
    Python心得基础篇【4】文件操作
    Python心得基础篇【3】基本知识
    Python心得基础篇【2】函数
    WCF使用net.tcp绑定的配置实例
    WCF:如何将net.tcp协议寄宿到IIS
    WCF使用net.Tcp绑定时的注意事项
    解决WCF跨机器调用时发生“调用方未由服务进行身份验证”的错误
    在IIS中部署好WCF服务站点后,本机访问服务无问题,局域网中其他电脑访问不到
  • 原文地址:https://www.cnblogs.com/shenba/p/1865203.html
  • Copyright © 2011-2022 走看看