Subtext中的skin实现方法

本文探讨了ASP.NET中用户控件的应用实践,通过Subtext博客平台实例介绍了如何利用用户控件实现功能模块化及页面定制化,重点讨论了业务逻辑的封装与复用。
     Subtext为.TEXT的个人版本.所以有很多相似,至今才来学习这个开源项目,也打算以此为基础修修补补.好好的分析一下其实现原理.


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

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

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

我们该如何做呢?

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

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

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

None.gif        protected System.Web.UI.WebControls.Literal PostCount;
None.gif        
protected System.Web.UI.WebControls.Literal StoryCount;
None.gif        
protected System.Web.UI.WebControls.Literal CommentCount;
None.gif        
protected System.Web.UI.WebControls.Literal PingTrackCount;
None.gif
None.gif
None.gif        
protected override void OnLoad(EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            
base.OnLoad (e);
InBlock.gif            
if(Context != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                BlogInfo info 
= Config.CurrentBlog;
InBlock.gif                PostCount.Text 
= info.PostCount.ToString(CultureInfo.InvariantCulture);
InBlock.gif                StoryCount.Text 
= info.StoryCount.ToString(CultureInfo.InvariantCulture);
InBlock.gif                CommentCount.Text 
= info.CommentCount.ToString(CultureInfo.InvariantCulture);
InBlock.gif                PingTrackCount.Text 
= info.PingTrackCount.ToString(CultureInfo.InvariantCulture);
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值