ASP.NET服務(wù)器控件之RenderContents簡(jiǎn)介
ASP.NET服務(wù)器控件之RenderContents的介紹:
本文重點(diǎn)介紹另一種實(shí)現(xiàn)控件呈現(xiàn)的常用方法--使用WebControl類(lèi)的RenderContents方法實(shí)現(xiàn)控件呈現(xiàn)。
基礎(chǔ)知識(shí)
就ASP.NET服務(wù)器控件而言只存在兩種情況:一種是具有外觀可視化元素的控件,還有一種是不具有外觀可視化元素的控件。如果需要開(kāi)發(fā)的服務(wù)器控件包含可視化元素,那么多數(shù)情況下,建議開(kāi)發(fā)人員創(chuàng)建繼承自System.Web.UI.WebControls.WebControl基類(lèi)的控件類(lèi)。這種做法的主要原因是基于便捷性考慮。因?yàn)椋琖ebControl類(lèi)可提供服務(wù)器控件的部分與外觀有關(guān)的公共屬性、方法和事件等。通過(guò)該類(lèi)定義的屬性,可以控制服務(wù)器控件的外觀和行為。例如,使用BackColor和ForeColor屬性,可以分別控制服務(wù)器控件的背景色和前景顏色;在可以顯示邊框的控件上,可以通過(guò)設(shè)置BorderWidth、BorderStyle和BorderColor屬性,控制邊框?qū)挾取⑦吙驑邮胶瓦吙蝾伾?;服?wù)器控件的大小可以通過(guò)Height和Width屬性來(lái)指定等等。如果控件基類(lèi)是Control類(lèi),那么實(shí)現(xiàn)這些類(lèi)似內(nèi)容則非常繁瑣。
在使用WebControl基類(lèi)實(shí)現(xiàn)ASP.NET服務(wù)器控件呈現(xiàn)的過(guò)程中,必然要使用該類(lèi)所提供的屬性和方法等成員對(duì)象。這是讀者需要重點(diǎn)掌握的內(nèi)容。另外,對(duì)于該基類(lèi)的構(gòu)造函數(shù)也是不容忽視的。下面首先從WebControl的構(gòu)造函數(shù)開(kāi)始入手進(jìn)行講解,隨后將說(shuō)明常見(jiàn)的成員對(duì)象。
WebControl類(lèi)包括三個(gè)構(gòu)造函數(shù),它們都用于初始化WebControl類(lèi)的新實(shí)例,然而它們之間還存在一些細(xì)小的差異。
◆protected WebControl ()
該構(gòu)造函數(shù)用于初始化表示Span HTML元素的WebControl類(lèi)的新實(shí)例。通常情況下,開(kāi)發(fā)人員并不直接調(diào)用此構(gòu)造函數(shù)。相反,它通常由派生類(lèi)的構(gòu)造函數(shù)調(diào)用以將TagKey屬性初始化為Span枚舉值。在隨后的示例中,將重寫(xiě)TagKey屬性,從而調(diào)用此構(gòu)造函數(shù)。
◆public WebControl (HtmlTextWriterTag tag)
開(kāi)發(fā)人員可使用此構(gòu)造函數(shù)創(chuàng)建并初始化使用指定的System.Web.UI.HtmlTextWriterTag值的WebControl類(lèi)的新實(shí)例。其中的參數(shù)tag表示HtmlTextWriterTag枚舉值之一??赡茏x者對(duì)于HtmlTextWriterTag還不太熟悉。它是一個(gè)枚舉類(lèi)型,其枚舉值多為HTML標(biāo)記,例如,A、B、Bold、Button等等。
◆protected WebControl (string tag)
使用此構(gòu)造函數(shù)可創(chuàng)建并初始化使用指定的HTML標(biāo)記的WebControl類(lèi)的新實(shí)例。其中參數(shù)tag表示HTML標(biāo)記。當(dāng)使用該構(gòu)造函數(shù)時(shí)一定要注意:不能直接調(diào)用此構(gòu)造函數(shù)。相反,它通常由派生類(lèi)的構(gòu)造函數(shù)調(diào)用以初始化TagKey和TagName屬性。
在了解了WebControl類(lèi)的構(gòu)造函數(shù)之后,讀者還必須了解WebControl類(lèi)的一些常用屬性和方法。下面列舉了這些常用成員對(duì)象,它們對(duì)于實(shí)現(xiàn)ASP.NET服務(wù)器控件呈現(xiàn)有著重要意義。
(1)Attributes屬性
該屬性用于獲取與控件的屬性不對(duì)應(yīng)的任意特性(只用于呈現(xiàn))的集合,其屬性類(lèi)型為AttributeCollection。
(2)ControlStyle屬性
該屬性用于獲取服務(wù)器控件的樣式,它是Style類(lèi)型。ControlStyle屬性封裝WebControl類(lèi)的所有外觀屬性,如BorderColor和Font。
(3)TagKey屬性
該屬性用于獲取與此服務(wù)器控件相對(duì)應(yīng)的System.Web.UI.HtmlTextWriterTag值,其屬性類(lèi)型為HtmlTextWriterTag枚舉。
(4)protected virtual void AddAttributeToRender(HtmlTextWriter writer);
該方法將需要呈現(xiàn)的HTML屬性和樣式添加到指定的System.Web.UI.HtmlTextWriter中。注意在重寫(xiě)過(guò)程中,一定要調(diào)用基類(lèi)中相應(yīng)的方法。
(5)public void ApplyStyle(Style s);
該方法將指定樣式的所有非空白元素復(fù)制到控件,改寫(xiě)控件的所有現(xiàn)有的樣式元素。
(6)public void MergeStyle(Style s);
該方法將指定樣式的所有非空白元素復(fù)制到控件,但不改寫(xiě)該控件現(xiàn)有的任何樣式元素。
(7)protected override void Render(HtmlTextWriter writer);方法
該方法重寫(xiě)了Control.Render。
(8)protected virtual void RenderContents(HtmlTextWriter writer);
該方法將ASP.NET服務(wù)器控件的內(nèi)容呈現(xiàn)到指定的編寫(xiě)器中。如果要在控件的標(biāo)簽中寫(xiě)入文本或其他內(nèi)容,則需要重寫(xiě)該方法;如果要使用默認(rèn)邏輯來(lái)呈現(xiàn)子控件,那么一定要調(diào)用基類(lèi)中相應(yīng)的方法。
可能讀者已經(jīng)注意到WebControl基類(lèi)中包括的兩個(gè)方法:Render和RenderContents。根據(jù)上文所介紹的內(nèi)容可知,Control基類(lèi)中包括Render方法。由于WebControl類(lèi)繼承自Control類(lèi),因此,WebControl類(lèi)中包含Render方法是無(wú)可非議的。然而,WebControl類(lèi)中卻有一個(gè)RenderContents方法,并且該方法與Render方法在功能、參數(shù)等方面都非常相似。那么在呈現(xiàn)控件過(guò)程中到底應(yīng)該使用哪一個(gè)呢?
實(shí)際上,在通常情況下,如果服務(wù)器控件自WebControl基類(lèi)派生,那么其中的Render方法很少使用,而主要使用RenderContents方法實(shí)現(xiàn)控件呈現(xiàn)。為了說(shuō)明其中的原因,我們必須了解WebControl基類(lèi)中Render方法的實(shí)現(xiàn)邏輯。
在WebControl基類(lèi)中的Render方法的實(shí)現(xiàn)示意性代碼如下所示:
- protected override void Render(HtmlTextWriter output)
- {
- RenderBeginTag(output);
- RenderContents(output);
- RenderEndTag(output);
- }
在WebControl基類(lèi)中的RenderBeginTag方法的實(shí)現(xiàn)示意性代碼如下:
- public virtual void RenderBeginTag(HtmlTextWriter output)
- {
- AddAttributesToRender(output);
- HtmlTextWriterTag tagKey = TagKey;
- if(tagKey != HtmlTextWriterTag.Unknown)
- {
- output.RenderBeginTag(tagKey);
- } else {
- output.RenderBeginTag(this.TagName);
- }
- }
在WebControl基類(lèi)中的RenderContents方法的實(shí)現(xiàn)示意性代碼如下:
- protected override void RenderContents(HtmlTextWriter output){
- //使用默認(rèn)邏輯來(lái)呈現(xiàn)子控件,那么一定要調(diào)用基類(lèi)中的方法。
- base.Render(output);
- }
分析以上代碼可以得出以下結(jié)論:
一、為了在由WebControl派生的類(lèi)中實(shí)現(xiàn)控件呈現(xiàn),必須重寫(xiě)AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法中的一個(gè)或者多個(gè),而不必重寫(xiě)Render方法。
二、重寫(xiě)AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等方法非常重要(請(qǐng)注意重寫(xiě)這些方法的條件及注意事項(xiàng)),否則服務(wù)器控件可能會(huì)出現(xiàn)丟失標(biāo)簽的情況,這將嚴(yán)重影響服務(wù)器控件的呈現(xiàn)。
三、當(dāng)呈現(xiàn)ASP.NET服務(wù)器控件標(biāo)簽中的內(nèi)容時(shí),必須重寫(xiě)RenderContents方法。
上文介紹了WebControl類(lèi)的一些基本知識(shí)。尤其是對(duì)于上文所列舉的示意性代碼需要重點(diǎn)理解。這對(duì)于實(shí)現(xiàn)控件呈現(xiàn)有著重要作用。
ASP.NET服務(wù)器控件之RenderContents的基本內(nèi)容將你介紹到這里,希望對(duì)你了解ASP.NET服務(wù)器控件之RenderContents有所幫助。
【編輯推薦】