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好比一个炉子,它可以帮助你煮熟你的食物,但是你要点什么呢?就是在子类里面指定。
我们做好了这样一个炉子,就可一迎接各种各样的顾客来品尝,这就是这个抽象类在此处的巧妙与优美。
看了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好比一个炉子,它可以帮助你煮熟你的食物,但是你要点什么呢?就是在子类里面指定。
我们做好了这样一个炉子,就可一迎接各种各样的顾客来品尝,这就是这个抽象类在此处的巧妙与优美。