日期:2011-08-21  浏览次数:20424 次

为了帮助您理解《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤的,现在我们一起来写一个代码分离带换皮肤功能的登陆页面:

第一步:新建ThemeDemo项目

第二步:添加基类SkinnedWebControl.cs

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;


namespace WebUC.ThemeDemo.Controls
{

    [
    ParseChildren(true)
    ]
    /// <summary>
    /// 换皮肤控件基类
    /// </summary>
    public abstract class SkinnedWebControl : WebControl, INamingContainer
    {

    string skinFilename = null;


    protected override void CreateChildControls()
    {
        Control skin;

        // 装载用户控件文件
        skin = LoadSkin();

        // 初始化控件和对控件绑定
        InitializeSkin(skin);

        Controls.Add(skin);
    }


    /// <summary>
    /// 装载用户控件文件
    /// </summary>
    /// <returns></returns>
    protected Control LoadSkin()
    {
        Control skin;

        // 用户控件文件默认放在Themes目录下
        string skinPath = "Themes/" + SkinFilename;

        // 是否定义了用户控件文件?
        if (SkinFilename == null)
        throw new Exception("必须定义SkinFilename属性,指定用户控件文件路径");

        // 通过Page.LoadControl(defaultSkinPath)方法,从用户控件文件中获取 UserControl 对象
        try
        {
        skin = Page.LoadControl(skinPath);
        }
        catch (FileNotFoundException)
        {
        throw new Exception("用户控件文件未找到!");
        }

        return skin;
    }


    /// <summary>
    /// 初始化控件,并绑定控件数据
    /// </summary>
    /// <param name="skin"></param>
    protected abstract void InitializeSkin(Control skin);

    /// <summary>
    /// 用户控件文件路径
    /// </summary>
    public string SkinFilename
    {
        get { return skinFilename;}
        set { skinFilename = value; }
    }

    }
}

第三步:创建Themes目录,并创建两个用户控件文件Login.ascx和Login1.ascx。布局样式不同,但是都必须包含以下控件:
TextBox    Username
TextBox    Password
Button     LoginButton
Label      Result
Login.ascx

  <P>登陆页的默认皮肤样式</P>
<P>用户名:<asp:TextBox id="Username" runat="server"></asp:TextBox></P>
<P>密  码:<asp:TextBox id="Password" runat="server" TextMode="Password"/></P>
<P&g