日期:2011-08-21 浏览次数:20439 次
为了帮助您理解《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