代码改变世界

Subtext中的skin实现方法

2007-04-06 20:51  Clingingboy  阅读(1559)  评论(9编辑  收藏  举报
     Subtext为.TEXT的个人版本.所以有很多相似,至今才来学习这个开源项目,也打算以此为基础修修补补.好好的分析一下其实现原理.


现在的博客都是可以随意换皮肤的,暂且不关注其是如何加载皮肤的.由于asp.net中有用户控件,所以开发者喜欢将一个系统的局部功能做在一个用户控件里面,然后在页面进行组装,这是个好办法。

原则的第一点是开发者必须保证实现用户控件局部的小功能,但发布以后用户可能不需要这么多功能,如博客园,你可以有选择性的在页面选择你喜欢的功能。可以说你在DIY页面。

接着,当你完成程序以后,你可能会给用户提供一个默认的界面和默认的博客功能,接着提供多套博客模板供选择。这里就引出一个问题,其他模板我有必要重新再写一遍程序吗?即我没必要重新为另外一套模板因为界面的不同重新实现同样的功能而白写代码。

我们该如何做呢?

一.尽量多的把功能拆分,然后完整的实现业务逻辑。如下代码,注意Inherits属性

<%@ Control Language="c#" Inherits="Subtext.Web.UI.Controls.BlogStats" %>
<ul style="display: none;">
    
<li>Posts - <asp:Literal ID="PostCount" Runat = "server" /></li>
    
<li>Stories - <asp:Literal ID="StoryCount" Runat = "server" /></li>
    
<li>Comments - <asp:Literal ID="CommentCount" Runat = "server" /></li>
    
<li>Trackbacks - <asp:Literal ID="PingTrackCount" Runat = "server" /></li>
</ul>

接着定义一个Subtext.Web.UI.Controls.BlogStats类

        protected System.Web.UI.WebControls.Literal PostCount;
        
protected System.Web.UI.WebControls.Literal StoryCount;
        
protected System.Web.UI.WebControls.Literal CommentCount;
        
protected System.Web.UI.WebControls.Literal PingTrackCount;


        
protected override void OnLoad(EventArgs e)
        
{
            
base.OnLoad (e);
            
if(Context != null)
            
{
                BlogInfo info 
= Config.CurrentBlog;
                PostCount.Text 
= info.PostCount.ToString(CultureInfo.InvariantCulture);
                StoryCount.Text 
= info.StoryCount.ToString(CultureInfo.InvariantCulture);
                CommentCount.Text 
= info.CommentCount.ToString(CultureInfo.InvariantCulture);
                PingTrackCount.Text 
= info.PingTrackCount.ToString(CultureInfo.InvariantCulture);
            }

        }

看看上面,你是否记得你是如何实现的,我们一般都是动态加载cs文件的,创建ascx文件的时候,vs就自动帮你加了个cs文件。那我们也可以变通下,这样的做法就可以实现模板的做法。

与用户的约定
记得你用的是用户控件,而非自定义控件,当你页面上使用服务器控件时,且存在业务逻辑时,必须保证服务器控件ID的正确性

主要思想,把一个用户控件实现的类抽出来,供同功能的其他的用户控件使用,很简单,记录下