在aspx文件中显示的如下:
 
<Forums:Default runat="server"/>
从这个可以看出是一个自定义用户控件
 
然后我们在看Forums标签的定义
<%@ Register TagPrefix="Forums" Namespace="AspNetForums.Controls" Assembly="AspNetForums.Controls" %>
可以看的出,这个自定控件的代码是AspNetForums.Controls.Default类来实现的。
 
如下是类AspNetForums.Controls.Default的定义
 
public class Default : SkinnedForumWebControl
{
 ForumContext forumContext = ForumContext.Current;
 protected string skinFilename = "Skin-Default.ascx";
 
 public Default() : base()
 {
 
  // Assign a default template name
  if (SkinFilename == null)
   SkinFilename = skinFilename;
 }
 
 protected override void InitializeSkin(Control skin)
 {
 
 }
 
}
 
他继承了SkinnedForumWebControl这个类,这个类是处理皮肤控件的基类,这个类定义了怎么通过一个用户控件名称来生成控件
protected string skinFilename = "Skin-Default.ascx";
说明这个控件是由Skin-Default.ascx来生成页面控件的
 
这样就可以直接通过定义一个界面的ascx文件来生成我所需要的界面,这样起到代码和界面的完全分离,
但是我又怎么取用户控件中的代码呢?以及控件的事件呢?
让我们看看login.cs这个登陆控件的代码
 
//初始化控件
override protected void InitializeSkin(Control skin)
{
 
    // Find the username control
    username = (TextBox) skin.FindControl("username");
 
    // Find the password control
    password = (TextBox) skin.FindControl("password");
 
    // Find the login button
    loginButton = (Button) skin.FindControl("loginButton");
    loginButton.Click += new System.EventHandler(LoginButton_Click);
    loginButton.Text = ResourceManager.GetString("LoginSmall_Button");
 
    // Find the autologin checkbox
    autoLogin = (CheckBox) skin.FindControl("autoLogin");
    autoLogin.Text = ResourceManager.GetString("LoginSmall_AutoLogin");
 
}
 
看其中采用了skin.FindControl的方式来找到我所需要的控件,名称是我在ascx定义好的。
事件和方法等等都是通过这种方式。
 
所以这里边和普通的usercontrol是不同的,其实这里面用到的确切一点说应该是复合控件,
只不过他的复合控件中的控件是通过usercontrol来提供的。