類比Asp.Net Forums實現可以換皮膚的控制項

來源:互聯網
上載者:User

為了協助您理解《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><asp:Button id="LoginButton" runat="server" Text="登陸"/></P>
<P><asp:Label id="Result" runat="server"/></P>

Login1.ascx

  <P>登陸頁的皮膚樣式1</P>
使用者名稱:<asp:TextBox id="Username" runat="server"/>
密  碼:<asp:TextBox id="Password" runat="server" TextMode="Password"/> 
<asp:Button id="LoginButton" runat="server" Text="登陸"/><asp:Label id="Result" runat="server"/>

第四步:建立Login控制項Login.cs

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

namespace WebUC.ThemeDemo.Controls
{
    /// <summary>
    /// 登陸控制項,繼承自SkinnedWebControl
    /// </summary>
    public class Login : SkinnedWebControl
    {
        string skinFilename = "Login.ascx"; // 指定預設皮膚樣式
        TextBox username; // 帳號輸入框
        TextBox password; // 密碼輸入框
        Button loginButton; // 登陸按鈕
        Label result; // 顯示登陸結果

        public Login()
        {
            if (SkinFilename == null)
                SkinFilename = skinFilename;
        }

        /// <summary>
        /// 重寫InitializeSkin,初始化控制項和對控制項進行綁定
        /// </summary>
        /// <param name="skin"></param>
        protected override void InitializeSkin(System.Web.UI.Control skin)
        {
            // 尋找ascx頁中ID是username的textbox控制項
            username = (TextBox) skin.FindControl("Username");
            // 綁定資料
            username.Text = "demo";

            // 尋找ascx頁中ID是password的textbox控制項
            password = (TextBox) skin.FindControl("Password");
            // 綁定資料
            password.Attributes.Add("value","demo");

            // 初始化Result控制項
            result = (Label) skin.FindControl("Result");

            // 找到登陸按鈕
            loginButton = (Button) skin.FindControl("LoginButton");
            loginButton.Click += new System.EventHandler(LoginButton_Click); // 綁定登陸按鈕的Click事件
        }

        /// <summary>
        /// 響應登陸按鈕事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void LoginButton_Click(Object sender, EventArgs e)
        {
            if (username.Text == "demo" && password.Text == "demo")
                result.Text = "<font color='blue'>登陸成功!";
            else
                result.Text = "<font color='red'>登陸失敗,使用者名稱密碼不匹配!";
        }

    }
}

 

第五步:建立兩個aspx頁,分別把兩種風格的登陸控制項加入。
Login.aspx

<%@ Register TagPrefix="uc" Namespace="WebUC.ThemeDemo.Controls" Assembly="ThemeDemo" %><HTML> <HEAD>  <title>換皮膚控制項測試——預設皮膚</title> </HEAD> <body>  <form runat="server">    <uc:Login runat="server"/>  </form> </body></HTML>

Login1.aspx

<%@ Register TagPrefix="uc" Namespace="WebUC.ThemeDemo.Controls" Assembly="ThemeDemo" %><HTML> <HEAD>  <title>換皮膚控制項測試——另一皮膚</title> </HEAD> <body>  <form runat="server">    <uc:Login runat="server" SkinFilename="Login1.ascx"/>  </form> </body></HTML>

最後,分別運行看看效果:)

源碼下載

原文地址 http://webuc.net/dotey/archive/2004/05/28/835.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.