成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

當前位置:首頁>>開發編程>>VS.NET>>新聞內容
Asp.net組件設計淺論
作者:椰子林 發布時間:2004-7-29 12:12:02 文章來源:csdn

一、什么是組件?

查看MSDN,微軟是這樣給組件定義的:在 .NET Framework 中,組件是指實現 System.ComponentModel.IComponent 接口的一個類,或從實現 IComponent 的類中直接或間接派生的類。這是從純語言(技術)角度下的定義,通俗的講,組件是“可獨立運作的軟件單元”,這里強調獨立運作,也就代表著組件必須擁有低耦合性、高重用性等特點。微軟將軟件劃分為兩部分:其一是Component,意指具備特定功能、可獨立運作、不具備UI接口的單元;其二是Control,也就是我們常說的控件,意指具備特定功能、可獨立運作的UI接口單元。

 

二、學習Asp.net組件需要掌握的知識

任意掌握一門.net語言,建議使用C#C#是一門全新的語言,但又借鑒了C++JAVA的語法,同時引入了一些新概念,在程序員中口啤不錯。

理解IIS的運行機制和asp.net的運行模式。

熟練掌握javascript,該腳本語言強大的功能在處理客戶端動作時表現非常出色,基本上所有的自定義組件都離不開javascript,同時,CSSDHTML也是要心知肚明的。沒辦法,他們很少會單獨出現,總是喜歡集體演出。

 

三、組件設計的難度

這個問題不用問,也許您猜出了幾分,一個字:難。

您也許會有所察覺,在編寫asp.net應用程序時,很少會對viewstate作深入的研究,原因很簡單,因為ViewState本身設計的用戶對象本來就不是應用程序員,而是組件設計員。如果不是因為客戶端需要,您也不會在asp.net中編寫大量的javascript腳本,而在組件設計中,很難逃脫干系。不止這些,是否設計成服務器組件?我們的組件是繼承Control、還是繼承WebControl或是繼承Component?在組件中,需要自定義Attribute嗎?需要實現數據綁定嗎?如何繪制組件的外觀?如何和IIS通訊?需要post-back嗎?很多很多的問題,都需要組件設計者——辛苦的您去一一考慮。

所以,如果您不屑一顧地說:不就是設計一個組件嗎?這有何難!那么,我會嘿嘿一笑,因為我知道,您一定在開玩笑。

但是,千萬別怕,“程序員需要探索精神哦!”

 

四、基類的選擇

如果我們設計的是一個WEB可視控件,并且構成WEB頁的一部分,那么可以繼承Control類或者WebControl類。如果是一個非可視控件,可以繼承Component,繼承此類的控件設計時不會出現在頁面上,而是出現在Component Tray中。還記得OpenFileDialog控件嗎?這個文件打開對話框控件就是出現在Component Tray控件中的。

如果我們只是在已有的控件基礎上增強功能,那么就繼承該已有的控件吧。

 

五、實踐出真知

假設我們要設計一個組件,該組件只允許用戶輸入數字,該驗證工作自然應該放到客戶端,客戶端的驗證腳本可以這樣寫:

 

<HTML>

<HEAD>

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<TITLE></TITLE>

<script language="javascript">

function Virty(ctrl)

{

    if (event.keyCode == 13)

        return true

    if (event.keyCode < 48 || event.keyCode > 57)

        return false;

    else

        return true;

}

</script>

</HEAD>

<BODY>

 <form method="POST" >

      <p>

        <input type="text" name="T1" size="20" OnKeyPress="javascript:return Virty(this);">

      </p>

 </form>

</BODY>

</HTML>

 

       當然,這些驗證代碼不能由用戶去寫,應該由組件設計者去寫,也就是說,當用戶把該組件從工具箱中拖到頁面上后,運行時應該自動生成驗證代碼。向WEB頁繪制代碼,我們重OnPreRender()方法就可以了。

       在重OnPreRender()方法之前,先寫定義幾個常量:

private const string SCP_NUMBER_ONLY_SCRIPT_ID="{29FD7A41-49FD-4fc4-AFA9-6A0B875A1A51}";

              private const string SCP_NUMBER_ONLY_HOOK="return Virty(this);";

              private const string SCP_NUMBER_ONLY_SCRIPT=

                     "<script language=\"JavaScript1.2\">\nfunction Virty (ctrl)\n{{\n"+

                              "if (event.keyCode == 13)\n return true;\n if (event.keyCode < 48 || event.keyCode > 57)\n return false;\n else\n return true;\n}}"+

                              "</script>";

       下面的方法用于驗證代碼的生成:

private void RenderJavaScript()

{

       if(!Page.IsClientScriptBlockRegistered(SCP_NUMBER_ONLY_SCRIPT_ID))       Page.RegisterClientScriptBlock(SCP_NUMBER_ONLY_SCRIPT_ID,string.Format(SCP_NUMBER_ONLY_SCRIPT,base.ID));

}

為什么會有Page.IsClientScriptBlockRegistered(SCP_NUMBER_ONLY_SCRIPT_ID)呢?我們想象一下,如果在WEB頁中有十個該控件,那是不是就要輸出十個這樣的腳本?顯然,這是畫蛇添足了,所以,我們要用IsClientScriptBlockRegistered()判斷該腳本是否在客戶端輸出,如果腳本在客戶端已注冊,則不再輸出了。

接下來就是重OnPreRender()方法了,該方法負責向客戶端繪制腳本。

protected override void OnPreRender(EventArgs e)

{

       base.OnPreRender (e);

       RenderJavaScript();                

}

大家應該注意到,該腳本需要事件觸發才會執行,當用戶從瀏覽器輸入數據時,如果是非數字,則忽略該動作,否則才接受輸入。這就需要OnKeyPress="javascript:return Virty(this);"這段代碼了。那么,這段代碼怎么向客戶端輸出呢?重寫AddAttributesToRender()方法吧,該方法負責繪制組件的屬性。于是,我們寫了下面一段代碼:

protected override void AddAttributesToRender(HtmlTextWriter writer)

{

       base.AddAttributesToRender(writer);              

       writer.AddAttribute("OnKeyPress",SCP_NUMBER_ONLY_HOOK);                 

}

       最后的源碼如下:

/////////////////////////////////////////////////////////////////////////////

/// 注意,本代碼版權所有者為黃忠成先生。

/// 在此表示感謝他寫的書《ASP.NET組件設計》

////////////////////////////////////////////////////////////////////////////

using System;

using System.Text;

using System.Drawing;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace PowerAsp.NET.Controls

{

    [ToolboxBitmap(typeof(NumberEditor),"PowerAsp.NET.Controls.NumberEditor.bmp")]

    public class NumberEditor:BaseEditor

    {

        private const string SCP_NUMBER_ONLY_SCRIPT_ID="{29FD7A41-49FD-4fc4-AFA9-6A0B875A1A51}";

        private const string SCP_NUMBER_ONLY_HOOK="return NumberEditor_KeyPress_Handle(this);";

        private const string SCP_NUMBER_ONLY_SCRIPT=

            "<script language=\"JavaScript1.2\">\nfunction NumberEditor_KeyPress_Handle(ctrl)\n{{\n"+

            "if (event.keyCode == 13)\n return true;\n if (event.keyCode < 48 || event.keyCode > 57)\n return false;\n else\n return true;\n}}"+

            "</script>";                                              

        //rending number-limit javaScript.

        private void RenderJavaScript()

        {

            if(!Page.IsClientScriptBlockRegistered(SCP_NUMBER_ONLY_SCRIPT_ID))    Page.RegisterClientScriptBlock(SCP_NUMBER_ONLY_SCRIPT_ID,string.Format(SCP_NUMBER_ONLY_SCRIPT,base.ID));

        }

        protected override void AddAttributesToRender(HtmlTextWriter writer)

        {

            base.AddAttributesToRender(writer);           

            writer.AddAttribute("OnKeyPress",SCP_NUMBER_ONLY_HOOK);        

        }

        protected override void OnPreRender(EventArgs e)

        {

            base.OnPreRender (e);

            RenderJavaScript();         

        }      

        public NumberEditor():base()

        {      

        }

    }

}

 


最新更新
·C#中使用Split分隔字符串的技
·VS2008開發中Windows Mobile
·PC機和移動設備上絕對路徑的
·C#程序加殼的方法(使用Sixx
·當前上下文中不存在名稱Conf
·請插入磁盤:Visual Studio 2
·用VS.NET讀取Flash格式文件信
·在ASP.NET中使用AJAX的簡單方
·VS.NET 2005中常用的一些代碼
·安裝VS.NET 2005 SP1補丁全攻
相關信息
·在ASP.NET中使用AJAX的簡單方法
·ASP.NET后臺代碼實現XmlHttp跨域訪問
·ASP.NET取得當前頁面的完整URL
·如何在ASP.NET程序里面執行DOS命令
·IIS5IIS6IIS7的ASP.net請求處理過程比較
·ASP.NET備份SQL Server數據庫的方法
·讓網站圖片“另存為”“無標題.bmp”的技巧
·ASP.NET GridView的分頁功能
·ASP.NET實現字母+數字方式驗證碼
·ASP.NET采集系統萬能正則表達式
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因為寂寞才想你
愛上你等于愛上了錯
在心里從此永遠有個你
一個人的寂寞兩個人的錯
主站蜘蛛池模板: 乐昌市| 怀柔区| 民乐县| 双桥区| 沧州市| 高碑店市| 聂拉木县| 化州市| 德钦县| 武威市| 萨迦县| 林芝县| 清河县| 台中市| 白玉县| 青州市| 定襄县| 衡水市| 定安县| 许昌市| 湟中县| 达州市| 和硕县| 东莞市| 申扎县| 佛教| 嫩江县| 万安县| 江山市| 丰顺县| 桂阳县| 通海县| 哈密市| 丽江市| 西林县| 棋牌| 涪陵区| 沁源县| 大埔区| 吴桥县| 松阳县|