轻松打造个人网站-关于整站配置和关键字定制

写在最前面:
        很高兴能继续编写《轻松打造个人网站》系列文章,在之前的文章中,许多朋友提出了忠恳的意见和善意的指点,让我更加有信心完成之后的文章。写这个系列文章的初衷就是与大家分享建站经验,并且在交流中互相促进,共同提高。再次重申,老刘水平有限,只是希望把自己建站中的实际经历分享给大家,如有不正之处,请各位指正,如果老刘的文章能给你带来一丝灵感,老刘会感到非常开心。这次有所不同的是,收回之前欢迎拍砖之云云,有些朋友很实在,哈哈。
      依然贴出站点地址,欢迎各位光临指导:
            http://www.024so.com
      ok,进入正题吧,这次的主题是整站配置和关键字定制。

         反复思量了一番,还是决定把整站配置和关键字定制两个主题放到一起来写,因为两个主题的实现方式大体相似,都是通过配置文件实现。提到Asp.net中的配置文件,首先会想到web.config,并且强大的Framework本身提供了丰富的API对web.config进行操作。同时Asp.net项目中还允许用户创建自定义的.xml配置文件,System.Xml命名空间同样提供了强大的API,让用户可以舒适的对配置文件进行操作,在我的项目中更多的采用了自定义配置文件,因为在自定义配置文件中可以让信息按照我所希望的格式搭建,同时我也可以创建一些API对指定格式的配置文件进行操作,相对更自由一些:)

首先说说整站配置:
         每个页面需要显示的内容大体都有多个数据块组成:
               其中包括列表块,比如文章列表;
               还有就是信息块,其中包括文章标题,列表,发布者,发布时间,浏览次数,评论次数等内容。
         拿一个列表块来说,我需要考虑以下因素:
               a.这些数据出现在哪个页面;
               b.会有多少行数据出现在这个列表中;
               c.如果标题过长,需要截取字符串,需要截取多少个字符;
               d.如果数据需要进行缓存,需要缓存多长时间。
         如果把每个数据块的参数都在配置文件中进行合理配置,那么当需要显示的数据块发生变化时(比如显示标题的行数)  ,就可以通过简单的修改配置文件,而不是通过硬编码的方式轻松搞定 。看一下我的配置文件吧,以下是网站首页的配置文件片段:

<setting>
  
<page id="1" title="index" desc="首页" duration="0">
    
<channel title="topgroup" desc="推荐圈子" duration="5" code="130">3</channel>
    
<channel title="topiclist" desc="文章列表" duration="0" code="130">8</channel>
    
<channel title="fevergroup" desc="热门圈子列表" duration="5" code="100">12</channel>
    
<channel title="lasteduser" desc="最新会员列表" duration="0" code="250">9</channel>
    
<channel title="grouplist" desc="最新圈子列表" duration="0" code="100">5</channel>
  
</page>
</setting>

         解释一下吧:
               page节点,顾名思义,代表的就是某某页面,
                     title属性代表页面的标题,用于唯一标识页面。              
               channel节点代表的就是某个数据块,
                     title属性代表块的标题,用于唯一标识数据块;
                     duration代表缓存时间;
                     code代表每行数据显示的字符数;
                     channel节点的文本值代表显示数据的数量。

         这样通过page的title和channel的title就可以唯一定位某数据块,只要通过API对某数据块节点进行数据访问操作就可以获得相应的信息了。
         简单谈一下配置文件API吧,其中包括如下方法:

               // 通过标题返回缓存时间,单位 秒 - public int GetPageDurationByTitle(string title);
               // 通过标题返回栏目缓存时间,单位 秒 - public int GetChannelDurationByTitle(string page, string title);
               // 获得显示行数量 - public int GetCourseTypeCount();
               // 通过栏目标题返回标题显示字符数量 - public int GetCodeByChannel(string page, string title);

         随便选一个,看看代码样例吧:
 

#region // 通过标题返回栏目缓存时间,单位 秒 - public int GetChannelDurationByTitle(string title)
        
/// <summary>
        
/// 通过标题返回栏目缓存时间,单位 秒
        
/// </summary>
        
/// <param name="page">页面名称</param>
        
/// <param name="title">栏目名称</param>        
        
/// <returns>还存时间</returns>
        public int GetChannelDurationByTitle(string page, string title)
        {
            
int second = -1;
            
if (base.IsFileExsited(filePath))
            {
                
try
                {
                    XmlElement root 
= base.GetDocumentRoot(filePath);
                    
string xpath = string.Format("/setting/page[@title='{0}']/channel[@title='{1}']", page, title);
                    XmlNode node 
= root.SelectSingleNode(xpath);
                    second 
= int.Parse(node.Attributes["duration"].Value);
                }
                
catch (Exception ex)
                {
                    
throw ex;
                }
            }
            
return second;
        }
        
#endregion

          

         很清晰明了了,通过xpath定位到需要得到的数据,然后将数据取出并返回。需要提示的是这一系列方法都需要验证配置文件路径是否有效和获得根节点引用的过程,所以把这些处理写到了基类中,在派生类中直接调用,于是出现了base.IsFileExisted(filePath)和base.GetDocumentRoot(filePath)的代码片段。

         ok,这样轻松的实现了访问数据配置。你也可以把你所需要配置的属性归纳一下,总结出你自己的配置文件和操作API,那么接下来我们一起谈谈关键字定制吧,套路都差不多:)

关于关键字定制:
         关于SEO,老刘就不多聊了,在这里只简单谈一谈如何实现动态加载页面title和meta标记,至于大家有什么好的搜索引擎优化方案,同样欢迎在这里讨论:)
         看配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<pages>
  
<page id="1" key="index" detail="首页">
    
<title>活在沈阳-活在沈阳的网上社区(024so.com)</title>
    
<keywords>沈阳,社区,论坛,生活,咨询,信息,资源,web2.0</keywords>
    
<description>活在沈阳,社区,论坛,开放,生活,咨询,信息,资源</description>
  
</page>
  
<page id="7" key="topic" detail="文章内容">
    
<title>{0}-活在沈阳网(024so.com)</title>
    
<keywords>沈阳,社区,论坛,生活,咨询,信息,资源,web2.0</keywords>
    
<description>活在沈阳,社区,论坛,开放,生活,咨询,信息,资源</description>
  
</page>
</pages>

         这里摘取了两个配置片段,一个是网站首页,一个是文章页,其中文章页中的title节点包括一个占位符,有了他,就可以实现动态添加文章标题了。当然如果要实现动态加载标记,只需要用数据访问API从配置文件中读取相应页面的数据就可以了,把这个调用过程写到MasterPage中就比较好,千万不要每个页面都写一次哦。。。
         看代码会更直观:

private void InitMeta()
    {
        PageSettingDAL dal 
= new PageSettingDAL();
        
// 截取 访问 url, 获得配置文件中的 key
        string source = Request.Path;
        
int begin = source.LastIndexOf('/');
        
int end = source.LastIndexOf('.');
        
string key = source.Substring(begin + 1, end - begin - 1).ToLower();
        
// 获得页面信息
        PageInfo info = dal.GetPageInfoByID(key);
        
// 初始化页面 title
        if (!string.IsNullOrEmpty(info.Title))
        {
            
if (info.Title.StartsWith("{0}"))
            {
                
this.Page.Title = string.Format(info.Title, _title);
            }
            
else
            {
                
this.Page.Title = info.Title;
            }
            
// 获得 htmlhead 引用
            HtmlHead head = (HtmlHead)Page.Header;
            
// 初始化 meta keyword
            HtmlMeta keywordMeta = new HtmlMeta();
            keywordMeta.Name 
= "keywords";
            keywordMeta.Content 
= info.KeyWord;
            head.Controls.Add(keywordMeta);
            
// 初始化 meta description
            HtmlMeta descMeta = new HtmlMeta();
            descMeta.Name 
= "description";
            descMeta.Content 
= Description;
            
// 添加 meta 到 htmlhead
            head.Controls.Add(descMeta);
        }
    }
      
         在MasterPage中的PageLoad()方法中调用之即可,如果是VS 2003,写一个PageBase也是一样的。老刘之前写过一篇《用MasterPage代替PageBase》对MasterPage和PaseBase有更详细的阐述,在此链接一下:
         http://www.cnblogs.com/ayuan/archive/2006/11/02/548295.html
         ok,解释一下上面的代码片段吧,首先通过字符串处理获得了页面的名称,这个名称就是配置文件中页面的Title,用这个名称可以进行页面唯一定位,之后获得某页面的标记信息。通过HtmlHead类可以操作页面头部信息,HtmlMeta的实例包括Name属性和Content属性,一看就知道是键值对的关系,附上keywords和description的名头并且添加相应内容就可以了,最后添加到HtmlHead实例中,就实现了动态加载Meta标记。
         要实现动态加载Title还要使一些小计量,判断一下配置文件中的title节点属性是不是以占位符开始的,如果以占位符开始,就需要从属性中获得Title值了,需要自己定义PageTitle属性,这次需要在.aspx.cs类中把从数据库中获得的文章标题传入MasterPage中了,是这样做的:
         在.aspx.cs类中:
             SYMasterPage master = (SYMasterPage)this.Master;
             master.PageTitle = title;
         首先获得MasterPage的引用,然后将标题通过自定义属性传入,ok,动态添加Title也就实现了:)


         这篇文章也就谈到这里了,希望给各位带来写灵感,希望给各位站长带来些实惠。和非著名相声演员郭德纲老师艺术家俩礼拜差不多,非资深程序开发人员老刘也站长差不多俩礼拜了,在这两个星期中,老刘体会了程序开发人员和网站推广人员的双重艰辛,我想园子里许朋友都有意打造自己的个站,老刘衷心希望给各位准站长提供竭诚的帮助,毕竟这年头,自己想干成点什么事,是多么的不容易啊,如果老刘微薄的帮助可以成为你成功路上的一个足迹,老刘将非常的欣喜。

posted on 2007-03-31 23:06  老刘.  阅读(3014)  评论(10编辑  收藏  举报

导航