2005-3-29+ 探索ASP.NET Forum(2)控件的使用

先前说了,forum内的页面都是用控件组成的,这些页面上的控件是一些自定义的服务器端控件,可是我们可以发现在项目里有很多的用户控件,这是怎么回事呢?
今下午盯着看了一个小时,终于弄明白了,然后还做了个示例,原来事情是这个样子地:
说的简单一些,就是forum在页面上使用了自定义控件,然后由自定义控件把相应的用户控件进行动态加载,把用户控件显示到页面上。
首页是一个大控件ForumGroupView,这个是继承自SkinnedForumWebControl,下面就用这个来说明。
先来说一下,子类和基类的关系,当你使用一个子类的,肯定是要进入基类。
页面加载的时候要对ForumGroupView进行初始化,这一切工作都是在InitializeSkin内完成的,该方法是基类的方法,在基类的CreateChildControls方法中被调用。而基类也是一个控件类,他出示了[ParseChildren(true)]特性,可以在内添加控件,那么CreateChildControls就是每次初始化必须被调用的方法。下面是CreateChildControls方法中的一段代码:
// Load the skin
skin = LoadSkin();

// Initialize the skin
InitializeSkin(skin);

Controls.Add(skin)
在这里面有一个LoadSkin方法,该方法是负责加载指定的用户控件并返回该控件的引用,然后由InitializeSkin负责对该控件进行操作。ForumGroupView重写了该方法,并在该方法中加入了自己的逻辑处理。
上面说的比较乱,下面配合页面加载的全过程来解释。
页面加载时需要创建一个ForumGroupView的实例,在创建的过程中,先是ForumGroupView在构造函数中给出了SkinFilename的值,指明要加载的控件View-ForumGroupView.ascx,这个用户控件用来对主页上的东西进行显示,然后进入SkinnedForumWebControl的CreateChildControls方法,在这里会先调用LoadSkin方法,根据给的用户控件的名动态加载该控件,然后程序向下走,进入InitializeSkin方法,注意,这个方法在子类ForumGroupView中是被override的,所以又进入到ForumGroupView中,在这里对View-ForumGroupView.ascx进行设置。 设置的详细过程包括一些数据库操作和逻辑操作。
基本过程就是这样,在看文章开头的那句话,是否明白了呢?
为什么要绕着弯用自定义控件加载用户控件而不是直接使用用户控件呢?很明显,是为了提供更改皮肤的功能。看SkinnedForumWebControl的构造函数就可以得到这个结论:
public SkinnedForumWebControl() {

// What skin should be used?
//
if (forumContext.User.IsAnonymous) {
skinName = Globals.Skin;
} else {
skinName = forumContext.User.Theme;
}

}

posted on 2006-07-05 18:37  Notus|南色的风  阅读(332)  评论(0编辑  收藏  举报