asp.net forums 的前台显示

public abstract class SkinnedForumWebControl : Control, INamingContainer我们继续,现在我们来看一下表现层,我一直都对大公司的表现层是如何实现的这个问题,很感兴趣。
看了asp.net Forum 是Telligent Systems公司的项目,下面我们具体的来看看它是怎么实现前台显示的。

首先我打开了Default.aspx文件,只有这一行内容:
<Forums:ForumGroupView ID="ForumGroupView1" runat="server" />
因为在web.config里面已经注册了Forums,所以,我们可以在Controls项目里面找到ForumGroupView.cs这个类。

我给出他的声明:

public class ForumGroupView : SkinnedForumWebControl

这个类是集成了SkinedForumWebControl的,于是我们先看SkinedForumWebControl,代码:
 

这个说明了这是一个典型的自己制作的模板化的控件,由于继承了Control,INamingContainer.
这是一个抽象类,里面只有一个抽象的方法,叫做InitializeSkin,这个方法就在ForumGroupView类里面实现了,这个方法是干什么的,我们先放下,后面说,先说这个抽象类SkinnedForumWebControl里面的其他方法。


这里面的思路是:
在CreateChildControl方法(继承自Control)里面,
1.获得一个自定义控件(ascx文件)的内容,添加到现在的控件,
2.调用InitializeSkin方法,来初始化这个皮肤(ascx控件。这里,asp.net forum的命名不太好,因为他这里面叫做“skin”,实际上不仅仅是一个“skin”,而是一个Control了)。但是InitializeSkin是一个抽象的方法,在子类里面重写之后才可以使用。

那么我们分别来看看,这两部分到底是怎么实现的,先看第一步,它是通过调用LoadSkin方法来实现的:

  protected Control LoadSkin()
        {
            Control skin;
            string skinPath = Globals.GetSkinPath() + "/Skins/" + SkinFilename.TrimStart('/');
            string defaultSkinPath = Globals.ApplicationPath + "/Themes/default/Skins/" + SkinFilename.TrimStart('/');

            // Do we have a skin?
            if (SkinFilename == null)
                throw new Exception("You must specify a skin.");

            // Attempt to load the control. If this fails, we're done
            try
            {
                skin = Page.LoadControl(skinPath);
            }
            catch (FileNotFoundException)
            {
                // Ok we couldn't find the skin, let's attempt to load the default skin instead
                try
                {
                    skin = Page.LoadControl(defaultSkinPath);
                }
                catch (FileNotFoundException)
                {
                    throw new Exception("错误:皮肤文件  " + skinPath + " 没有找到. 皮肤必须被指定,以用于控件的呈现.");
                }
            }

            return skin;
        }
  
看被我涂黄了那部分,关键的就是他,使用Page.LoadControl方法来实现。(Page.loadControl方法详见MSDN)。参数是一个文件名,SkinFilename一个属性,那么这个属性是在哪里赋值的呢?我们在后面说

第二步,看InitializeSkin方法,他在我们的这个例子里面,是在ForumGroupView.cs里面实现的。看一下他的代码:
protected override void InitializeSkin(Control skin)
        {
            repeater = (Repeater) skin.FindControl("forumGroupRepeater");

            // Add an item command to the forum group repeater
            //
            repeater.ItemCreated += new RepeaterItemEventHandler(OnItemCreated);

            // Databind the forum group repeater
            //
            DataBind();

        }

就是很简单的,在skin这个控件里面获得一个repeater,然后进行数据绑定。同样在这个类里面,你会看到,SkinFileName这个属性是在
public ForumGroupView()
        {
            // Assign a default template name
            if (SkinFilename == null)
                SkinFilename = skinFilename;

        }
他的构造函数里面赋值的。
我们看看在我们这个例子里面是什么值呢?
private string skinFilename = "View-ForumGroupView.ascx";

我们在themes\skins\ 下面可以找到这个文件,打开后你就会豁然开朗。

总结,我们来回想一下他是怎么工作的:

在SkinedForumWebControl里面读取,添加了它的子类里面指定的文件,并且调用子类实现的抽象方法,来进行数据绑定加上事件等处理。

我们举个例子:我们去吃火锅。
SkinnedForumWebConTrol好比一个炉子,它可以帮助你煮熟你的食物,但是你要点什么呢?就是在子类里面指定。

我们做好了这样一个炉子,就可一迎接各种各样的顾客来品尝,这就是这个抽象类在此处的巧妙与优美。
posted on 2008-04-01 19:49  prayforsmile  阅读(179)  评论(0编辑  收藏  举报