溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET中如何使用Render方法

發(fā)布時間:2021-07-16 11:17:44 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

ASP.NET中如何使用Render方法,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

我們還是先來看看與ASP.NET Render方法相關(guān)的兩個方法

//RenderControl方法的基本實現(xiàn)   public void RenderControl(HtmlTextWriter writer)   {   if(Visible)   {   Render(writer);   }   }   //Render方法基本實現(xiàn)   protected virtual void Render(HtmlTextWriter writer)   {   RenderChildren(writer);   }   //RenderChildren方式基本實現(xiàn)   protected virtual void RenderChildren(HtmlTextWriter writer)   {   foreach (Control c in Controls)   {   c.RenderControl(writer);   }   }

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

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

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

ASP.NET中如何使用Render方法

我們知道,每個控件都有Visible和EnableViewState屬性,Visible用來設(shè)置控件是否被呈現(xiàn).

ASP.NET中如何使用Render方法

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

ASP.NET中如何使用Render方法

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

ASP.NET中如何使用Render方法

(1)System.Web.UI.LiteralControl

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

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

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

示例一

﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥   ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥  ﹤head﹥﹤title﹥    鏃犳爣棰橀〉  ﹤/title﹥﹤/head﹥  ﹤body﹥   ﹤form name="form1" method="post" action="Default1.aspx" id="form1"﹥  ﹤div﹥  ﹤input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"   value="/wEPDwULLTExNTUxMDYxODdkZHVaWm47e5anDettRKviGvS0nDWQ" /﹥  ﹤/div﹥    ﹤div﹥   ﹤span id="Label1"﹥Label﹤/span﹥﹤br /﹥   ﹤br /﹥   ﹤input name="TextBox1" type="text" id="TextBox1" /﹥﹤br /﹥   ﹤br /﹥   ﹤br /﹥   ﹤br /﹥   ﹤div id="Panel1" style="height:50px;width:125px;"﹥   ﹤/div﹥    ﹤/div﹥     ﹤div﹥     ﹤input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"     value="/wEWAgK/5/fTBwLs0bLrBrVw7YrSp5G/l4sJGPkKN/asFj2W" /﹥  ﹤/div﹥﹤/form﹥  ﹤/body﹥  ﹤/html﹥

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

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

示例二

 ﹤%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Trace="true" %﹥   ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥   ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥  ﹤head runat="server"﹥   ﹤title﹥無標題頁﹤/title﹥  ﹤/head﹥  ﹤body﹥   ﹤form id="form1" runat="server"﹥   ﹤asp:Label ID="Label1" runat="server" Text="Label"﹥   ﹤/asp:Label﹥﹤asp:TextBox ID="TextBox1" runat="server"﹥   ﹤/asp:TextBox﹥   ﹤asp:Button ID="Button1" runat="server" Text="Button" Visible="False" /﹥   ﹤asp:Panel ID="Panel1" runat="server" Height="50px" Width="125px"﹥﹤/asp:Panel﹥   ﹤/form﹥  ﹤/body﹥  ﹤/html﹥

運行效果

ASP.NET中如何使用Render方法

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

(2)大家繼續(xù)看圖四的Button1,大家會發(fā)現(xiàn)它呈現(xiàn)的大小字節(jié)數(shù)為0,因為我們設(shè)置了Button1的Visible值為False,所以未呈現(xiàn)此控件.

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

if(Visible)

Render(writer);

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

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

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

ASP.NET中如何使用Render方法

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

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

if(Visible) {}

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

base.RenderControl(writer);

你會發(fā)現(xiàn)在頁面呈現(xiàn)時的控件有兩個,一個在RenderControl方法方法輸出,一個在Render方法輸出,因為
base.RenderControl方法調(diào)用了Render方法,當設(shè)置控件Visible屬性為False時,Render方法輸出的內(nèi)容被隱藏(未被呈現(xiàn),而RenderControl方法輸出的內(nèi)容仍然存在.現(xiàn)在大家應(yīng)該了解RenderControl方法的作用了吧.

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

ASP.NET中如何使用Render方法

(3)RenderChildren方法

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

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

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

將發(fā)現(xiàn)其子控件呈現(xiàn)字節(jié)為0

ASP.NET中如何使用Render方法

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

發(fā)現(xiàn)其子控件呈現(xiàn)字節(jié)并非為0,而是10

ASP.NET中如何使用Render方法

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

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

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

(1)RenderControl方法

先判斷其Visible然后調(diào)用Render方法

(2) Render方法

使用HtmlTextWriter將標記字符和文本輸出然后調(diào)用RenderChildren方法

(3)RenderChildren方法

判斷當前控件是否有子控件,然后再調(diào)用RenderControl方法根據(jù)子控件的Visible值輸出子控件.

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

看完上述內(nèi)容,你們掌握ASP.NET中如何使用Render方法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI