[译]为大型网站用ASP.NET2.0生成一个动态的网站地图

翻译:德仔工作室 http://www.dezai.cn
原文: Daniel Doubrovkine
下载实例: Download source - 9.91 Kb
在线演示: Live Demo
原文网址: http://www.codeproject.com/aspnet/dynamicsitemap.asp
翻译教程下载:
Flash动画


Flash动画


概 要

  在一个固定的网站中有一个网站地图或网站路径类似的页面是非常有用,并且容易生成出来.但对应动态网站而言,这些看起来似乎很简单的事,其实变得复杂多了.当我开始查阅相关动态网站的网站地图时,我发现了一个共同的方法:为整个网站生成一个静态的网站地图页面. 在一定的时期内,通过运用XMLSiteMapProvider来实现阶段性的生成.这种方法在codeproject里面有相关的文章介绍.但这种方法根本不适合于我的网站.我需要对成批量的页面还包括数以万讲的潜在页面提供一个网站地图.这个网站几乎完全是动态生成的,只有一小部分不可预知的页面是经常使用的,即使这样,他们也是有在后台数据库生成的两百多种不同类型的对象类型,他们在前台界面所呈现的样式根本不一样.要对这样一个大站生成一张精确的网站地图需要花费大量的时候,需要编写大量的代码,在一定程度 中也会消耗大量的内存.这篇文章使用了一种更为简单而实际的解决方案,你可以在线查看演示 www.foodcandy.com

架 构

  这个架构的核心在于一个相对简单的.基于StaticSiteMapProvider的SiteMapDataProvider动态数据源.这个数据源设置成为一个默认的数据源,在整个应用程序中使用权,还可以在网站地图的路径中产生相对应的节点.每个页面都可以呈现出包括节点自身所在的合适的一系列的子节点与父节点.

实 现

  SiteMapDataProvider是非常直接的,它可以生成一个根节点,同时还可以在根节点下的所有存在的节点中产生一个路径生成并生成子节点



public class SiteMapDataProvider : StaticSiteMapProvider
{
private SiteMapNode mRootNode = null;

...

// create the root node
public override void Initialize(string name,
        NameValueCollection attributes)
{
     base.Initialize(name, attributes);
     mRootNode = new SiteMapNode(this, "Home",
                 "Default.aspx", "Home");
     AddNode(mRootNode);
}

public override SiteMapNode FindSiteMapNode(string rawUrl)
{
     return base.FindSiteMapNode(rawUrl);
}

// stack a node under the root
public SiteMapNode Stack(string title, string uri)
{
     return Stack(title, uri, mRootNode);
}

// stack a node under any other node
public SiteMapNode Stack(string title, string uri,
                    SiteMapNode parentnode)
{
     lock (this)
     {
         SiteMapNode node = base.FindSiteMapNodeFromKey(uri);

         if (node == null)
         {
             node = new SiteMapNode(this, uri, uri, title);
             node.ParentNode =
               ((parentnode == null) ? mRootNode : parentnode);
             AddNode(node);
         }
         else if (node.Title != title)
         {             // support renaming documents
             node.Title = title;
         }
  
         return node;
     }
}
}




我将上面的实现方法编译在一个dbBlock.SitemapProvider.ll里面,并且在web.config里面进行了相关的设置.






              defaultProvider="SiteMapDataProvider">
  
           type="DBlock.SiteMapDataProvider, DBlock.SiteMapDataProvider" />
  

  






  现在要注意的是,我们的目标是生成一个动态的网站地图.我增加了一个按钮用于转向相对应的演示页面(Default.aspx?id=).为了让呈现的网站的地图保持一致,我又在网站地图的节点中增加了相关的链接,并把他们放在相对应的页面中.下面就是在default.aspx中的page_load事件中所输入的代码,更多的功能可以通过SiteMapProvider来实现




string id = Request["id"];
if (!string.IsNullOrEmpty(id))
{
  List> nodes =
     new List>();
  nodes.Add(new KeyValuePair     Uri>("Dynamic Content", new Uri(Request.Url, "Default.aspx?id=")));
  nodes.Add(new KeyValuePair(Request["id"], Request.Url));
  ((SiteMapDataProvider) SiteMap.Provider).Stack(nodes);
}
public void Stack(List> nodes)
{
  SiteMapNode parent = RootNode;
  foreach (KeyValuePair node in nodes)
  {
   parent = Stack(node.Key, node.Value.PathAndQuery, parent);
  }
}



兴 趣 点


  这样的工作对检索动态的网站内容非常有用.我的工程就是通过数据库和缓存来实现检索目标的,他们在每一个页面中都能显示出来.此方法的最大的缺点就在为了能生成网站地图,你必须在每一个页面中增加代码,同时你需要对你的节点仔细检查站你的URL是否正确以保证金路径的一致. 在其他一些表单中,用于描述这些动态页面之间的关系那是一件很了不起的事.也许,更好的一个办法,是扩展XML并以此来动态绑定在节点中? 为了避免消耗过多的内存,对于大型网站来说,你也可以限制网站地图的大小.当达到你所限制的大小时,你可以简单的清理一下网站地图.




上一篇: 收集的一些日历控件
下一篇: 作的一个登陆界面
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 321 | 查看次数: 41551
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 30 字 | UBB代码 关闭 | [img]标签 关闭