成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET控件開發之RenderContents使用淺析

開發 后端
ASP.NET控件開發之RenderContents使用主要向你介紹通過ASP.NET控件開發RenderContent呈現自定義控件的相關內容。

ASP.NET控件開發基礎之RenderContents使用呈現自定義控件的步驟:

ASP.NET控件開發之RenderContents使用一.從繼承WebControl開始

在第二篇教程中,重點介紹了Render()方法的使用,用來呈現控件,但從Control類繼承的控件尚未發揮asp.net控件的作用.大家知道web服務器控件分為HTML服務器控件(如﹤input id="Button2" runat="server" type="button" value="button" /﹥這樣的形式)和標準服務器控件(就是﹤asp:..  id="" runat="server" /﹥這樣的形式的控件)

HTML服務器控件的控件從System.Web.UI.HtmlControls.HtmlControl 類派生

標準服務器控件的控件從System.Web.UI.WebControls.WebControl 類派生

HtmlControl 類和WebControl 類則從System.Web.UI.Control 類派生,并擴展.

所以我們說,所有的服務器控件都繼承自System.Web.UI.Control 類,即所有的服務器控件都具有Control 類的共同屬性,如Visible,EnableViewState屬性,HtmlControl 類和WebControl 類則擴充了System.Web.UI.Control 類的功能,如

HtmlControl 類定義了所有 HTML 服務器控件所通用的方法、屬性 (Property) 和事件(具體參數參照MSDN)

WebControl 類定義了所有 標準服務器控件所通用的方法、屬性 (Property) 和事件(具體參數參照MSDN)

如每個繼承了WebControl 類的標準控件都有定義外觀和行為的屬性,然后不同控件再根據需要擴展功能.

 

所以我們推薦的做法是直接從WebControl 類派生,而非Control類.我們所做的非并從頭開始.從WebControl 類繼承可以幫我們省很多工作.

ASP.NET控件開發之RenderContents使用二.重寫WebControl類方法,不再是Render()

WebControl類繼承了Control類,當然有Render方法,在WebControl類中重寫了Render方法,如下代碼

示例一

  1. protected override void Render(HtmlTextWriter output)  
  2. {  
  3.  RenderBeginTag(output);  
  4.  RenderContents(output);  
  5.  RenderEndTag(output);  

注意 RebderBeginTag方法并非是HtmlTextWriter類中的方法,而是WebControl類中的方法,表示輸出HTML標簽頭標記,如﹤table .....﹥,RenderEndTag方法則輸出HTML標簽尾標記,如﹤/table﹥.中間的RenderContents方法則就是Control類的Render方法. 看下面RenderContents方法的定義.

示例二

  1. protected override void RenderContents(HtmlTextWriter output){   
  2.  //使用默認邏輯來呈現子控件,那么一定要調用基類中的方法。   
  3.  base.Render(output);  

接著再看RenderBeginTag方法的定義

示例三

  1. public virtual void RenderBeginTag(HtmlTextWriter output)  
  2. {  
  3.     //添加呈現控件的屬性和樣式  
  4.     //AddAttributesToRender為WebControl類中的方法  
  5.     AddAttributesToRender(output);  
  6.     //呈現控件標簽  
  7.     //如label控件呈現﹤span ﹥  
  8.     //textbox控件呈現﹤input ﹥  
  9.     HtmlTextWriterTag tagKey = TagKey;  
  10.     if (tagKey != HtmlTextWriterTag.Unknown)  
  11.     {  
  12.         output.RenderBeginTag(tagKey);  
  13.     }  
  14.     else 
  15.     {  
  16.         output.RenderBeginTag(this.TagName);  
  17.     }  

這里打個比方,假設你要輸出一個表格,你就必須定義﹤table﹥標簽頭,然后在其內部定義﹤tr﹥,﹤td﹥,下面看Control類中Render方法的實現,表明Render方法必須完成所有的任務,包括標簽頭標記﹤table﹥和﹤table﹥標簽的屬性和樣式的輸出.

示例四

  1. protected override void Render(HtmlTextWriter writer)  
  2. {  
  3.     //為table標簽定義屬性和樣式  
  4.     writer.AddAttribute(HtmlTextWriterAttribute.Width, "287px");  
  5.     writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "0");  
  6.  
  7.     writer.RenderBeginTag(HtmlTextWriterTag.Table);  
  8.  
  9.       
  10.     writer.RenderBeginTag(HtmlTextWriterTag.Tr);  
  11.     writer.RenderBeginTag(HtmlTextWriterTag.Td);  
  12.     writer.Write("﹤strong﹥" + PaymentMethodText + "﹤/strong﹥");  
  13.     writer.RenderEndTag();  
  14.     writer.RenderBeginTag(HtmlTextWriterTag.Td);  
  15.     writer.AddAttribute(HtmlTextWriterAttribute.Name, "PaymentMethod");  
  16.     writer.AddAttribute(HtmlTextWriterAttribute.Id, "PaymentMethod");  
  17.     writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");  
  18.     writer.RenderBeginTag(HtmlTextWriterTag.Select);  
  19.  
  20.     //以下代碼省略  

在WebControl類中重寫了Render方法后,直接幫你定義好了標簽,默認情況下為﹤span﹥,可通過重寫TagKey屬性來修改標簽,然后AddAttributesToRender方法為標簽定義樣式和屬性

示例五

  1. protected override HtmlTextWriterTag TagKey  
  2. {  
  3.   get { return HtmlTextWriterTag.Table; }  

示例六

  1. protected override void AddAttributesToRender(HtmlTextWriter writer)  
  2. {  
  3.     //為table標簽定義屬性和樣式  
  4.     writer.AddAttribute(HtmlTextWriterAttribute.Width, "287px");  
  5.     writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "0");  
  6.  
  7.     base.AddAttributesToRender(writer);  
  8.  

接著重寫RenderContents方法,對比上面的Render方法,實現效果是一樣的

示例七

  1. protected override void RenderContents(HtmlTextWriter writer)  
  2. {  
  3.   //注意,此處無沒有table標簽,只定義其內部標簽  
  4.   writer.RenderBeginTag(HtmlTextWriterTag.Tr);  
  5.   writer.RenderBeginTag(HtmlTextWriterTag.Td);  
  6.   writer.Write(PaymentMethodText);  
  7.   writer.RenderEndTag();  
  8.   writer.RenderBeginTag(HtmlTextWriterTag.Td);  
  9.   writer.AddAttribute(HtmlTextWriterAttribute.Name, PaymentMethodSelectName);  
  10.   writer.AddAttribute(HtmlTextWriterAttribute.Id, PaymentMethodSelectId);  
  11.   writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");  
  12.   writer.RenderBeginTag(HtmlTextWriterTag.Select);  
  13.   //以下省略  
  14.  

所以說重寫后的Render方法在默認情況下加了一個標簽,而你可以重寫這個標簽(默認情況下為﹤span﹥).可能大家對其感到奇怪,即然可以實現同樣效果,有必要重寫Render方法,再加一個RenderContents方法嗎?

ASP.NET控件開發之RenderContents使用三.Render方法和RenderContents方法的區別

當你繼承WebControl類,在RenderContents方法中實現示例四代碼時,(我們再以以前的例子展示)呈現后的代碼如下,看到沒有,控件ID為﹤span﹥
在RenderContents方法輸入的標簽將成為其內部標簽.再看看這個控件的屬性面板,你會看到很多的繼承自WebControl類的屬性,設置其屬性,即是設置﹤span﹥標簽的屬性.TagKey的作用大概就在于此吧,為了使用WebControl類的公共屬性.(我是這么認為的)而非定義在﹤table﹥標簽上
示例八

  1. ﹤span id="CreditCardForm5_1"﹥﹤table style="border-width:0;"﹥  
  2.     ﹤tr﹥  
  3.         ﹤td﹥﹤strong﹥信用卡類型﹤/strong﹥﹤/td﹥﹤td﹥﹤select name="PaymentMethod" id="PaymentMethod" style="width:100%;"﹥  
  4. ...... 

假設我們稱﹤span﹥里面的﹤table﹥等標簽為子標簽,在RenderContents方法應該定義控件的子標簽,如果你只定義標簽屬性的話,只需重寫AddAttributesToRender方法即可,可不須重寫RenderContents方法.

下面再講下重寫標簽的方法

(1) 重寫TagKey屬性,下面重寫label控件的標簽

  1. public class Ch4Label: Label  
  2.   {  
  3.       protected override HtmlTextWriterTag TagKey  
  4.       {  
  5.           get { return HtmlTextWriterTag.Div; }  
  6.       }  
  7.   } 

(2)重寫基類構造函數,此方法只有在繼承Control類后適用

  1. public CreditCardForm5() : base(HtmlTextWriterTag.Table) { } 

最后總結下:

1.控件繼承自WebControl類

主要原因是WebControl類公共的東西比Control類

2.TagKey

表示控件的標簽,默認情況下為﹤span﹥,可以重寫此屬性修改或者重寫WebControl類的構造函數

3.AddAttributesToRender方法

為標簽添加屬性和樣式

4.RenderContents方法

在標簽內呈現內容

如果控件不復雜,則可直接從標準控件繼承(如label),再根據需要擴展,重寫AddAttributesToRender方法,還可以重寫

TagKey更改默認標簽,而無須重寫RenderContents方法.如果控件比較復雜,不是單一的,則需要在RenderContents方法輸出控件的內部的內容.

其實最大的區別就是默認情況下WebControl類為你加了一個標簽,方便添加WebControl類的一些公共的東西,如果你重寫Render()方法,而舍棄RenderContents方法,你就無福享受WebControl類給你提供的這么多屬性和方法了.

大家多熟悉下WebControl類的一些公共屬性,然后再多改改,可以明白的更加深刻.

我喜歡慢慢的把東西全講全,不然心里不舒服,所以我就慢慢寫了,當然前提是我理解的基礎上.這次的例子,大家可根據第二篇的代碼適當修改就可.錯誤之處還請指出^_^

ASP.NET控件開發之RenderContents使用就向你介紹到這里,希望對你了解ASP.NET控件開發基礎之RenderContents使用有所幫助。

【編輯推薦】

  1. ASP.NET服務器控件之處理回傳數據淺析
  2. ASP.NET服務器控件之捕獲回傳事件淺析
  3. ASP.NET控件開發基礎之事件處理淺析
  4. ASP.NET服務器控件之RenderContents簡介
  5. ASP.NET服務器控件之RenderContents應用示例
責任編輯:仲衡 來源: 博客園
相關推薦

2009-08-06 14:16:04

ASP.NET服務器控

2009-08-06 14:42:54

ASP.NET服務器控

2009-08-05 18:32:28

HtmlTextWriASP.NET控件開發

2009-08-07 15:24:16

ASP.NET模板控件

2009-08-07 14:05:21

ASP.NET控件

2009-08-05 18:46:21

ComboBox顯示ASP.NET控件開發

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發

2009-08-07 15:34:15

ASP.NET數據綁定

2009-07-27 17:25:53

ASP.NET驗證控件

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-07 17:59:35

控件設計器

2009-08-04 15:20:59

ASP.NET數據驗證數據驗證控件

2009-08-06 18:18:27

ASP.NET控件開發ASP.NET復合控件

2009-08-05 17:11:51

ASP.NET控件開發ASP.NET服務器控

2009-08-07 17:41:07

ASP.NET Web

2009-07-28 09:32:41

ASP.NET自定義控

2009-08-07 17:49:44

控件設計器

2009-08-06 17:52:45

ASP.NET控件開發自定義控件

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設計

2009-08-06 13:08:23

ASP.NET控件開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 农村真人裸体丰满少妇毛片 | 色五月激情五月 | 久久久久一区二区 | 久久久国产一区二区三区 | 国产一区二区三区免费 | 欧美一级毛片在线播放 | 国产精品美女久久久久久免费 | 午夜资源| 一区二区三区视频在线免费观看 | 亚洲视频区 | 久久大陆| 久久久91 | 久久美女视频 | 亚洲一区精品视频 | 91久久久久久 | 亚洲视频一区二区三区 | 亚洲一区二区网站 | 久久久91精品国产一区二区三区 | 午夜专区 | 亚洲视频 欧美视频 | 久久亚洲精品国产精品紫薇 | 亚欧洲精品在线视频免费观看 | 黄色片免费在线观看 | 熟女毛片| 欧美一级网站 | 国产aa| 欧美午夜视频 | 国产精品黄色 | 久久99久久98精品免观看软件 | 欧美一二三四成人免费视频 | 男人天堂网av | 韩国欧洲一级毛片 | 一本色道精品久久一区二区三区 | 天天操操操操操 | 美女久久| 一区二区三区不卡视频 | 日韩二区三区 | 国产精品夜夜夜一区二区三区尤 | 国产成在线观看免费视频 | 精品日韩一区 | 午夜精品久久久 |