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

ASP.NET服務器控件Render方法的使用淺析

開發 后端
ASP.NET服務器控件Render方法的使用主要是想大家講述了通過ASP.NET服務器控件中ASP.NET Render方法來呈現自定義控件的內容。

對于ASP.NET服務器控件Render方法的使用或許大家還對為何要重寫Render方法存有疑惑,希望大家看看我舉的例子,能夠明白ASP.NET Render方法和其他兩個方法的作用,然后真正明白為何一般情況下只須重寫ASP.NET Render方法。

我們知道我們每次編寫控件時,都需要重寫ASP.NET Render方法,我們發現在Control類中很多方法可以重寫,但我們沒有去重寫他們,我們需要遵循一個原則,在需要重載的時候再去重寫他們

我們還是先來看看與ASP.NET Render方法相關的兩個方法

  1. //RenderControl方法的基本實現  
  2.  public void RenderControl(HtmlTextWriter writer)  
  3.  {  
  4.  if(Visible)  
  5.  {  
  6.  Render(writer);  
  7.  }  
  8.  }  
  9.  //Render方法基本實現  
  10.  protected virtual void Render(HtmlTextWriter writer)  
  11.  {  
  12.  RenderChildren(writer);  
  13.  }  
  14.  //RenderChildren方式基本實現  
  15.  protected virtual void RenderChildren(HtmlTextWriter writer)  
  16.  {  
  17.  foreach (Control c in Controls)  
  18.  {  
  19.  c.RenderControl(writer);  
  20.  }  
  21.  } 

相信看過"ASP.NET服務器控件開發技術與實例"這本書的人,肯定看過上面的一段代碼.

假設你不理解上面的流程(我也不一定理解,希望我的思路對你有幫助),我認為有一種很好的方式來理解上面的流程,跟大家分享一下.

現在拋開上面的代碼,我們來建一個簡單的頁面,隨意的拖幾個控件到界面上,注意***一個三panel控件,如下圖

panel控件 

我們知道,每個控件都有Visible和EnableViewState屬性,Visible用來設置控件是否被呈現.

Visible和EnableViewState屬性 

現在我們把button控件的Visible屬性設置為flase,我們看到了我們預期的效果,接著請啟用頁面跟蹤,這個很重要

Visible屬性設置 

在服務器上運行這個頁面,大家可以在控件樹上看到下面畫面

在服務器上運行 

(1)System.Web.UI.LiteralControl

大家可以看到,在我們定義的每個控件之間都有System.Web.UI.LiteralControl.

這里需要說明的是,要理解任何不需要在服務器上處理的任何其他字符串.

如何理解呢?大家打開這個運行頁面的源代碼頁面,如下代碼,大家看到沒有,除了服務器控件外,我們有其他元素(不需要在服務器上處理的任何其他字符串),包括空格.

示例一

  1. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  2.  
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥  
  4.  
  5. ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥  
  6. ﹤head﹥﹤title﹥  
  7.   鏃犳爣棰橀〉  
  8. ﹤/title﹥﹤/head﹥  
  9. ﹤body﹥  
  10.  ﹤form name="form1" method="post" action="Default1.aspx" id="form1"﹥  
  11. ﹤div﹥  
  12. ﹤input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"   
  13. value="/wEPDwULLTExNTUxMDYxODdkZHVaWm47e5anDettRKviGvS0nDWQ" /﹥  
  14. ﹤/div﹥  
  15.  
  16.  ﹤div﹥  
  17.  ﹤span id="Label1"﹥Label﹤/span﹥﹤br /﹥  
  18.  ﹤br /﹥  
  19.  ﹤input name="TextBox1" type="text" id="TextBox1" /﹥﹤br /﹥  
  20.  ﹤br /﹥  
  21.  ﹤br /﹥  
  22.  ﹤br /﹥  
  23.  ﹤div id="Panel1" style="height:50px;width:125px;"﹥   
  24. ﹤/div﹥  
  25.   ﹤/div﹥  
  26.    
  27. ﹤div﹥  
  28.  
  29.   ﹤input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" 
  30.  
  31.    value="/wEWAgK/5/fTBwLs0bLrBrVw7YrSp5G/l4sJGPkKN/asFj2W" /﹥  
  32. ﹤/div﹥﹤/form﹥  
  33. ﹤/body﹥  
  34. ﹤/html﹥ 

為了讓大家更加明白System.Web.UI.LiteralControl的意思的,讓我們來修改HTML頁面,說明:以上代碼為運行后的HTML源代碼.而不是我們所說的源代碼,大家應該明白我所指的源代碼的意思.

我們來修改代碼,注意:我把﹤form..以下的標簽無空格的寫在了一起.看下面修改后的代碼

示例二

  1.  ﹤%@ Page Language="C#" AutoEventWireup="true" 
  2. CodeFile="Default2.aspx.cs" Inherits="Default2" Trace="true" %﹥  
  3.  
  4. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  5. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥  
  6.  
  7. ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥  
  8. ﹤head runat="server"﹥  
  9.  ﹤title﹥無標題頁﹤/title﹥  
  10. ﹤/head﹥  
  11. ﹤body﹥  
  12.  ﹤form id="form1" runat="server"﹥  
  13.  
  14. ﹤asp:Label ID="Label1" runat="server" Text="Label"﹥  
  15.  
  16. ﹤/asp:Label﹥﹤asp:TextBox ID="TextBox1" runat="server"﹥  
  17.  
  18. ﹤/asp:TextBox﹥  
  19.  
  20. ﹤asp:Button ID="Button1" runat="server" Text="Button" Visible="False" /﹥  
  21.  
  22. ﹤asp:Panel ID="Panel1" runat="server" Height="50px" Width="125px"﹥﹤/asp:Panel﹥  
  23.  
  24. ﹤/form﹥  
  25. ﹤/body﹥  
  26. ﹤/html﹥ 

運行效果

運行效果 

現在發現控件之間已經沒有System.Web.UI.LiteralControl了,因為我去掉了空格.這個也說明了一點,如果代碼很亂的話會影響速度.現在大家應該明白System.Web.UI.LiteralControl的意思了吧.

(2)大家繼續看圖四的Button1,大家會發現它呈現的大小字節數為0,因為我們設置了Button1的Visible值為False,所以未呈現此控件.

下面我們來理解這一點,大家重新看到RenderControl方法,如果Visible值為True則呈現此控件.

if(Visible)

 Render(writer);

為了理解這個方法,我們來重寫此方法,我們以***次講的CreditCardForm3控件為例

我們重寫RenderControl方法,把ASP.NET Render方法的代碼全部拷貝到RenderControl方法中,然后去掉Render方法

然后在ASP.NET頁面使用此控件,定義其Visible值為False

定義其Visible值 

運行這個例子以后,你會發現控件還是呈現了,就是因為你重寫了RenderControl方法,使控件的Visible值無效了

所以我們就要加上一個判斷

if(Visible) {}

否則的話,此方法呈現的內容沒有Visible值.為了更加深刻理解這一點,我們重寫基類的RenderControl方法的方法.

base.RenderControl(writer);

你會發現在頁面呈現時的控件有兩個,一個在RenderControl方法方法輸出,一個在Render方法輸出,因為
base.RenderControl方法調用了Render方法,當設置控件Visible屬性為False時,Render方法輸出的內容被隱藏(未被呈現,而RenderControl方法輸出的內容仍然存在.現在大家應該了解RenderControl方法的作用了吧.

如果ASP.NET服務器控件的 Visible 屬性設置為 true,則向頁呈現服務器控件的內容,所以一般情況下我們不重寫此方法.因為一般控件都需要Visible 屬性,除非特殊情況.

Visible 屬性設置 

(3)RenderChildren方法

再重新看到圖四,大家可以看到,我們拖放的控件是在屬于form1的子控件,panel控件是一個容器控件,因為下面沒拖放控件,任何其他顯示的字符串表現為System.Web.UI.LiteralControl,大家可以拖幾個控件到panel里再重新運行看看,會發現拖進去的控件變為panel的子控件.最明顯的的測試方法是Wizard控件,拖放一個Wizard控件然后再測試你就會明白了.

RenderChildren方法則判斷當前控件是否有子控件,如果有,則根據RenderControl方法判斷控件的Visible值來呈現控件.所以大家在重寫Render方法時,不重寫基類Render方法時,將無法實現RenderChildren方法.帶來的后果將是無法呈現子控件.

下面我們來測試一下.我們還是以CreditCardForm3控件為例子(請先把RenderControl方法的內容全注釋掉),當未重實現RenderChildren方法時則無法呈現子控件內容,請啟動跟蹤

將發現其子控件呈現字節為0

子控件呈現字節 

由于CreditCardForm3繼承了CreditCardForm2,所以重寫基類Render方法將會重復輸出,我們可以直接在Render方法中重寫RenderChildren方法.再來測試.將會發現有些變化

發現其子控件呈現字節并非為0,而是10

子控件呈現字節 

說明其子控件還是存在東西的,只不過沒有用而已,所以大家可以根據實際需求來確實是否要重寫RenderChildren方法,一般的話都會重寫Render方法,這樣保險一點

好了,現在再來回顧下剛開始給出的代碼,通過上面的試驗,你是否明白了?

呈現自定義控件的步驟(注意:下面三個方法都可以呈現,不過我們已經說過了,像在RenderControl方法用HtmlTextWriter預先輸出的話,就喪失Visible的功能(說不定你就不需要這個功能,那時你就可以重寫這個方法了)

(1)RenderControl方法

先判斷其Visible然后調用Render方法

(2) Render方法

使用HtmlTextWriter將標記字符和文本輸出然后調用RenderChildren方法

(3)RenderChildren方法

判斷當前控件是否有子控件,然后再調用RenderControl方法根據子控件的Visible值輸出子控件.

我們了解上面三個方法后,就會知道,一般情況下,我們無須重寫RenderControl方法和RenderChildren方法.所以最合適的就是重寫Render方法了.說了一大堆.目的就是為了說明為什么要重寫Render方法.

上次,忘了把代碼傳上了,不小心只上傳了dll文件,不好意思.這次就寫這么多.希望大家能夠真正明白.大家可以適當的修改代碼,這樣你會發現更多.

如果有什么錯誤請大家指出,希望多跟大家交流^_^

ASP.NET服務器控件中ASP.NET Render方法的使用就向你介紹到這里,希望你對于用ASP.NET Render方法來呈現自定義控件的內容有所了解。

【編輯推薦】

  1. ASP.NET控件開發之UpdatePanel觸發JavaScript腳本技巧
  2. ASP.NET控件開發技巧之關閉基類不必要的功能
  3. ASP.NET控件開發技巧之使用HtmlTextWriter類淺析
  4. ASP.NET控件開發技巧之ComboBox顯示淺析
  5. ASP.NET控件開發基礎之自定義控件淺析
責任編輯:仲衡 來源: 博客園
相關推薦

2009-08-03 18:00:00

ASP.NET服務器控

2009-08-10 14:25:33

ASP.NET服務器控

2009-08-05 17:11:51

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

2009-08-07 17:49:44

控件設計器

2009-08-06 10:49:45

ASP.NET服務器控

2009-07-28 13:26:34

Render方法ASP.NET

2009-07-28 09:46:53

ASP.NET服務器控

2009-08-04 13:10:05

ASP.NET服務器控

2009-08-06 11:24:50

ASP.NET服務器控

2009-08-06 11:05:48

ASP.NET服務器控

2009-07-27 17:25:53

ASP.NET驗證控件

2009-08-07 17:59:35

控件設計器

2009-08-04 15:20:59

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

2009-08-10 14:08:15

ASP.NET服務器控ASP.NET組件設計

2009-08-01 10:07:58

ASP.NET服務器控ASP.NET

2009-08-04 17:18:37

2011-07-12 15:17:02

ASP.net服務器控件

2009-08-04 15:13:38

2009-07-30 16:52:38

復合控件ASP.NET服務器控

2009-08-06 15:21:45

ASP.NET控件開發RenderConte
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 丁香久久| 免费的色网站 | 天堂网av在线 | 亚洲精品日韩在线 | 午夜在线观看视频 | 成人久久久 | 国产成人免费视频网站高清观看视频 | 高清国产午夜精品久久久久久 | 国产午夜精品久久久久 | 国产精品久久久久久av公交车 | 日本久久精 | 91国内精品 | 视频一区中文字幕 | 在线观看免费av片 | 成人精品毛片国产亚洲av十九禁 | 欧美久久一区二区三区 | 91视频国产区 | 羞羞视频免费在线观看 | 久久精品国产99国产精品 | 欧美国产日韩在线观看成人 | 欧美日韩一卡二卡 | 不卡一区 | 久久久www | 国产精品高潮呻吟久久久久 | 红桃成人在线 | 亚洲精品一区二三区不卡 | 精品国产伦一区二区三区观看体验 | 欧美中文字幕一区二区三区亚洲 | 亚洲成人黄色 | 成人性生交大片免费看中文带字幕 | 青青久草| 草久久久 | 欧美国产日韩在线观看 | 成人免费一级 | 精品久久一区 | 欧美午夜精品久久久久久浪潮 | 国产伦一区二区三区四区 | 日本激情一区二区 | 成人在线亚洲 | 毛片黄| 欧美又大粗又爽又黄大片视频 |