针对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,设置一下属性即可,开起来比较多,其实可以省略不少的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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等就不用说了,官网有详细的配置说明
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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的方式提供了展现的方式,主要有以下方式(引用官网的描述)
以上步骤完成之后,基本上可以得到类似如下格式的导航菜单
当然我们一般的页面可以用这种简单方式配置,如果涉及动态显示,如本例中的产品明细节点,那么需要实现自己的生成节点的方式, 即实现自己的 dynamicNodeProvider。实现自定义的NodeProvider的方式如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{
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作了简单的研究,更高级的应用有待后续学习、补充。