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

ASP.NET服務器控件之RenderContents應用示例

開發 后端
ASP.NET服務器控件之RenderContents應用示例向你講述了ASP.NET服務器控件之RenderContents應用的例子,具體的實現代碼。

ASP.NET服務器控件之RenderContents應用示例

相信讀者在瀏覽各個網站時,經常會看到"聯系我們"等類似文字。當單擊這些文字時,操作系統將自動打開自身所帶的郵件客戶端軟件,提示用戶發送郵件。本例將實現一個自定義服務器控件RenderContentsControl,其用于通過呈現包含"mailto:郵件地址"的超鏈接。本例的示例效果圖如圖1所示:

示例效果圖 

如圖1所示,頁面中呈現了超鏈接文字"我的郵箱地址"。當單擊該鏈接,系統將發送郵件給"my@mysample.com"。

在實現以上ASP.NET服務器控件之前,首先應分析如下:本控件包含外觀元素,例如,文字大小、顏色、是否粗體等。為此,控件基類不應從Control類繼承,而應從WebControl類繼承。這樣,開發人員將不必自行實現這些外觀樣式屬性等內容。

下面列舉了實現自定義服務器控件的RenderContentsControl.cs文件源代碼。

  1. using System;  
  2. using System.ComponentModel;  
  3. using System.Security;  
  4. using System.Security.Permissions;  
  5. using System.Web;using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7. namespace UsingRenderContentsControl{   
  8. [  
  9.  AspNetHostingPermission(SecurityAction.Demand, 
  10. Level = AspNetHostingPermissionLevel.Minimal),   
  11.  AspNetHostingPermission(SecurityAction.InheritanceDemand, 
  12. Level = AspNetHostingPermissionLevel.Minimal),   
  13. DefaultProperty("Email"), ParseChildren(true"Text"),  
  14.  ToolboxData("﹤{0}:RenderContentsControl runat=server﹥﹤/{0}:RenderContentsControl﹥")   
  15. ]   
  16.  
  17.  public class RenderContentsControl : WebControl {   
  18.   // 實現Email屬性   
  19.   [Bindable(true)]  
  20.   [Category("Appearance")]  
  21.   [DefaultValue("")] [Localizable(true)]  
  22.  
  23.   public string Email   
  24.   {  
  25.    get {  
  26.     String s = (String)ViewState["Email"];   
  27.     return ((s == null) ? String.Empty : s);   
  28.    }  
  29.    set {  
  30.     ViewState["Email"] = value;  
  31.    }  
  32.   }  
  33.   // 實現Text屬性   
  34.  
  35.   [  
  36.    Bindable(true), Category("Appearance"), DefaultValue(""), Localizable(true),   
  37.    PersistenceMode(PersistenceMode.InnerDefaultProperty)  
  38.   ]  
  39.  
  40.   public virtual string Text  
  41.   {  
  42.    get {   
  43.     string s = (string)ViewState["Text"];  
  44.     return (s == null) ? String.Empty : s;  
  45.    }  
  46.    set {  
  47.     ViewState["Text"] = value;   
  48.    }  
  49.   }  
  50.   // 重寫TagKey屬性   
  51.  
  52.   protected override HtmlTextWriterTag TagKey  
  53.   {  
  54.    get {   
  55.     return HtmlTextWriterTag.A;  
  56.    }  
  57.   }  
  58.  
  59.   // 重寫AddAttributesToRender方法   
  60.  
  61.   protected override void AddAttributesToRender(HtmlTextWriter writer)   
  62.   {  
  63.    base.AddAttributesToRender(writer);  
  64.    writer.AddAttribute(HtmlTextWriterAttribute.Href, "mailto:" + Email);  
  65.   }  
  66.  
  67.   // 重寫RenderContents方法  
  68.  
  69.   protected override void RenderContents(HtmlTextWriter writer)  
  70.   {  
  71.    if (Text == String.Empty) {  
  72.     Text = Email;  
  73.    }  
  74.    writer.WriteEncodedText(Text);  
  75.   }  
  76.  }  

 

如上代碼所示,RenderContentsControl類繼承自WebControl基類,其原因在前文已經說明。另外,在RenderContentsControl類的實現過程中,還包括了元數據屬性標記、3個屬性(Email、Text和TagKey)和2兩個方法(AddAttributesToRender和RenderContents)實現等內容。下面逐一對這些內容進行分析。

代碼說明之3個屬性:

在上文代碼中主要包括了3個屬性:Email、Text和TagKey。Email屬性用于獲取或者設置具體的電子郵件地址,Text屬性用于獲取或者設置控件顯示的文本內容。在這兩個屬性實現中,都使用了控件視圖狀態ViewState。ASP.NET服務器控件的視圖狀態為其所有屬性值的累計。對于簡單屬性的實現,將經常使用ViewState。TagKey屬性是重寫屬性,其繼承自WebControl基類,這是讀者需要理解的重點內容。重寫TagKey屬性主要是為了呈現HTML標記中的a元素,這樣就不會呈現WebControl類所默認呈現的span元素。此處,也暗示了本控件使用的構造函數是繼承自WebControl的protected WebControl (),讀者可返回上文再看看有關這個構造函數的說明。需要讀者牢記的是:如果要呈現的元素是HtmlTextWriterTag枚舉的成員,則應重寫TagKey屬性。許多常見的HTML元素標記被映射為HtmlTextWriterTag枚舉的值。例如,System.Web.UI.HtmlTextWriterTag.A與a元素對應,而System.Web.UI.HtmlTextWriterTag.Table與table元素對應。如果要呈現的元素不是由HtmlTextWriterTag枚舉的成員表示,那么建議重寫TagName屬性,并返回要作為元素呈現的字符串。

代碼說明之2個方法:

在RenderContentsControl服務器控件中重寫了2個重要方法:一個是AddAttributesToRender、另一個是RenderContents。

(1)AddAttributesToRender

該方法用于為ASP.NET服務器控件添加一個Href屬性,并將該屬性值設置為"mailto:Email",其中Email是上文所述的表示郵件地址的屬性。當重寫AddAttributesToRender方法時,應始終按照控件源代碼演示的方式:首先,調用基類方法,然后進行相關設置。這樣才能實現為服務器控件添加樣式和其他屬性的功能。實際上,根據前文所述的RenderBeginTag方法的實現示意性代碼可知,AddAttributesToRender方法是由WebControl的RenderBeginTag方法調用。

(2)RenderContents

該方法是本示例的核心內容,其用于在ASP.NET服務器控件的標記中寫入由Text屬性指定的超鏈接文本。如代碼所示,服務器控件調用了HtmlTextWriter實例的WriteEncodedText方法,以對開發人員輸入的文本進行HTML編碼。一般情況下,為了安全起見,應該對用戶提供的文本進行HTML編碼。

代碼說明之元數據屬性標記:

元數據屬性標記在類前和屬性實現前都有所應用。有關這些元數據屬性標記的說明,在以前的文章中已經進行了具體說明。讀者可查閱有關講解如何創建一個簡單的服務器控件的文章。下面重點說明一下有關內部文本持久性的問題。

在類前的元數據屬性標記中,設置了ParseChildren(true, "Text")。在Text屬性前的元數據屬性標記中,設置了PersistenceMode(PersistenceMode.InnerDefaultProperty)。通過以上兩個設置,則為控件添加了內部文本持久性設置。如此設置,可使得開發人員能夠在控件標記代碼內設置Text屬性。例如:

﹤Sample:RenderContentsControl runat="server" ID="CustomerControl" Email="my@mysample.com"﹥我的郵箱地址﹤/Sample:RenderContentsControl﹥

在上面的代碼中,原來文本"我的郵箱地址"應由Text屬性設置(這就是默認持久性),然而,由于內部文本持久性設置,因此,可以在控件標記內設置控件文本。

實現內部持久性,應使用ParseChildren(true, "Text")來標記RenderContentsControl控件。ParseChildren的***個參數true,其用于指定頁分析器應將控件標記內的內容分析為屬性,而不是子控件。第二個參數提供控件的內部默認屬性名稱為Text。使用這兩個參數調用ParseChildren構造函數時,控件標記內的內容必須與內部默認屬性對應。Text屬性的PersistenceMode(PersistenceMode.InnerDefaultProperty),用于指定可視化設計器應將此屬性作為控件標記中的內部內容進行序列化。

通常,WebControl類使用PersistChildren(false)和ParseChildren(true)控制設計時和分析時屬性的持久性。這兩個屬性將被控件繼承,且僅在要更改繼承的設置時需要應用。PersistChildren告知設計器是否應將ASP.NET服務器控件的子控件作為嵌套的內部控件保存。false參數指示內部內容與屬性對應,而不是與子控件對應。ParseChildren已在上一段中加以說明。如果WebControl類的設計時和分析時持久性適用于您的控件,則不必重寫從WebControl繼承的PersistChildren和ParseChildren。

下面列舉了用于測試服務器控件的Default.aspx文件源代碼:

  1. ﹤%@ Page Language="C#" AutoEventWireup="true" 
  2. CodeFile="Default.aspx.cs" Inherits="_Default" %﹥  
  3. ﹤%@ Register TagPrefix="Sample"
  4.  Assembly="UsingRenderContentsControl" Namespace="UsingRenderContentsControl" %﹥  
  5. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  6. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥  
  7. ﹤html xmlns="http://www.w3.org/1999/xhtml"﹥  
  8. ﹤head id="Head1" runat="server"﹥  
  9. ﹤title﹥使用RenderContents方法實現控件呈現﹤/title﹥  
  10. ﹤/head﹥  
  11. ﹤body﹥  
  12. ﹤form id="form1" runat="server"﹥  
  13. ﹤div﹥  
  14. ﹤Sample:RenderContentsControl runat="server"
  15.  ID="CustomerControl" Font-Bold="true" Font-Size="small" 
  16. ForeColor="Blue" Email="my@mysample.com"﹥我的郵箱地址﹤/Sample:RenderContentsControl﹥  
  17. ﹤/div﹥  
  18. ﹤/form﹥  
  19. ﹤/body﹥  
  20. ﹤/html﹥  

如上粗體代碼所示,RenderContentsControl控件中設置了Font-Bold、Font-Size、ForeColor、Email等屬性,同時,還在控件標記之間設置了文本內容。當然,如果開發人員將Text屬性值設置為相同的文本內容也是可以的。以上代碼比較簡單,在此不再說明了。

通過這個示例,我們需要重點掌握RenderContents和AddAttributesToRender方法,以及TagKey屬性的使用。提請讀者注意的是雖然服務器控件的代碼比較復雜,但是結構很簡單。切不可被復雜的樣式設置和客戶端行為代碼弄得不知所措,而是要注意體會兩個重點方法的使用過程。

在服務器控件開發成功之后,***能夠查看其HTML代碼,并將服務器代碼和HTML代碼作以比較,搞清楚每一條ASP.NET服務器控件代碼呈現了什么樣的HTML代碼。通過這個方法,相信讀者能夠對ASP.NET服務器控件的呈現方法有更加深刻的體會。下面列舉了當用戶在瀏覽器中運行以上頁面,并查看相關的Html源文件時可得到的代碼:

  1. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  2.  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥  
  3. ﹤html xmlns="http://www.w3.org/1999/xhtml"﹥  
  4. ﹤head id="Head1"﹥  
  5. ﹤title﹥ 使用RenderContents方法實現控件呈現﹤/title﹥  
  6. ﹤/head﹥  
  7. ﹤body﹥  
  8. ﹤form name="form1" method="post" action="Default.aspx" id="form1"﹥  
  9. ﹤div﹥  
  10. ﹤input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"   
  11. value="/wEPDwULLTEyNTQwNjQyMDJkZOlJ3PyMGs2hmzn9MU6Ogt9V+5ag" /﹥  
  12. ﹤/div﹥  
  13. ﹤div﹥  
  14. ﹤a id="CustomerControl" href="mailto:my@mysample.com"   
  15. style="color:Blue;font-size:Small;font-weight:bold;"﹥我的郵箱地址﹤/a﹥  
  16. ﹤/div﹥   
  17. ﹤/form﹥  
  18. ﹤/body﹥  
  19. ﹤/html﹥  

通過觀察以上代碼可知,自定義服務器控件RenderContentsControl實際呈現的結果是粗體所示部分的代碼,其最終呈現為一個表示超鏈接的﹤a﹥標記,其中包括href、Style和文本等屬性值。它們的值與Default.aspx文件源代碼中,RenderContentsControl控件的屬性設置有著密切關系。例如,Email屬性值最終呈現為href屬性值等等。讀者可自行對照查看,這對于理解控件呈現很有益處。

小結

本文主要介紹了WebControl類的一些基本知識,并且利用這些基本知識創建了一個簡單的控件呈現實例。實際上,從中讀者應該能夠總結出來,創建繼承自WebControl基類的自定義服務器控件,其中最為重要的重寫RenderContents方法。記住這一點是非常重要的。至此,筆者已經利用兩篇文章來介紹實現控件呈現的方法。在以后的文章中,將介紹有關為ASP.NET服務器控件實現屬性等方面的內容。

ASP.NET服務器控件之RenderContents應用示例的相關內容就向你介紹到這里,希望你能了解ASP.NET服務器控件之RenderContents的應用。

【編輯推薦】

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

2009-08-06 14:16:04

ASP.NET服務器控

2009-08-06 15:21:45

ASP.NET控件開發RenderConte

2009-08-10 14:08:15

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

2011-07-12 15:03:28

2009-08-04 13:10:05

ASP.NET服務器控

2009-08-05 17:11:51

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

2009-08-03 15:43:22

asp.net控件

2009-08-04 17:18:37

2011-07-12 15:17:02

ASP.net服務器控件

2009-08-03 18:00:00

ASP.NET服務器控

2009-08-10 14:25:33

ASP.NET服務器控

2009-07-28 09:46:53

ASP.NET服務器控

2009-07-30 16:52:38

復合控件ASP.NET服務器控

2009-07-27 12:56:27

控件CheckBoxLASP.NET服務器

2009-08-04 13:39:43

ASP.NET 2.0

2009-08-04 15:13:38

2009-08-06 11:24:50

ASP.NET服務器控

2009-08-07 13:56:46

ASP.NET控件開發

2009-08-01 20:59:08

ASP.NET服務器控ASP.NET服務器ASP.NET

2009-08-01 10:07:58

ASP.NET服務器控ASP.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区中文 | 伊人春色在线 | 免费观看av网站 | 国产91久久久久 | 精品欧美乱码久久久久久1区2区 | 九九久久国产精品 | 国产精品免费一区二区三区四区 | www.亚洲精品 | 亚洲成人免费 | 国产精品美女久久久久久久久久久 | 午夜影院网站 | 久久久看 | 国产欧美一区二区三区在线看 | 中文一区| 国产激情一区二区三区 | 国产蜜臀97一区二区三区 | 欧美一区二区三区视频在线观看 | 欧美涩涩网| 亚洲一区综合 | 99精品久久99久久久久 | 欧美国产视频 | 天堂久久网| 精品久久久久久久 | 麻豆精品一区二区三区在线观看 | 免费不卡av| 日韩国产精品一区二区三区 | 日本成人在线免费视频 | 精品欧美一区二区三区久久久小说 | 亚洲午夜av久久乱码 | 色综合中文 | 在线成人| 日韩在线三级 | 蜜桃臀av一区二区三区 | 国产精品亚洲一区二区三区在线观看 | 伊人欧美视频 | 亚洲人成人一区二区在线观看 | aaa一区| 日韩www | 99国产精品一区二区三区 | 久久久久国产一区二区三区 | 特级一级黄色片 |