不帅 发表于 2015-1-16 22:39:26

ASP.NET网页设计ASP.NET服务器控件之RenderContents

C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。asp.net|服务器|控件  上一篇文章先容了利用Control类的Render办法完成控件出现的基础常识和示例使用。本文重点先容另外一种完成控件出现的经常使用办法--利用WebControl类的RenderContents办法完成控件出现。

  基本常识

  就服务器控件而言只存在两种情形:一种是具有表面可视化元素的控件,另有一种是不具有表面可视化元素的控件。假如必要开辟的服务器控件包括可视化元素,那末多半情形下,倡议开辟职员创立承继自System.Web.UI.WebControls.WebControl基类的控件类。这类做法的次要缘故原由是基于便利性思索。由于,WebControl类可供应服务器控件的部分与表面有关的大众属性、办法和事务等。经由过程该类界说的属性,能够把持服务器控件的表面和举动。比方,利用BackColor和ForeColor属性,能够分离把持服务器控件的背景致和远景色彩;在能够显现边框的控件上,能够经由过程设置BorderWidth、BorderStyle和BorderColor属性,把持边框宽度、边框款式和边框色彩;服务器控件的巨细能够经由过程Height和Width属性来指定等等。假如控件基类是Control类,那末完成这些相似内容则十分烦琐。

  在利用WebControl基类完成控件出现的过程当中,一定要利用该类所供应的属性和办法等成员工具。这是读者必要重点把握的内容。别的,关于该基类的机关函数也是不容无视的。上面起首从WebControl的机关函数入手下手动手举行解说,随后将申明罕见的成员工具。

  WebControl类包含三个机关函数,它们都用于初始化WebControl类的新实例,但是它们之间还存在一些微小的差别。

  (1)protectedWebControl()

  该机关函数用于初始化暗示SpanHTML元素的WebControl类的新实例。一般情形下,开辟职员其实不间接挪用此机关函数。相反,它一般由派生类的机关函数挪用以将TagKey属性初始化为Span列举值。在随后的示例中,将重写TagKey属性,从而挪用此机关函数。

  (2)publicWebControl(HtmlTextWriterTagtag)

  开辟职员可以使用此机关函数创立并初始化利用指定的System.Web.UI.HtmlTextWriterTag值的WebControl类的新实例。个中的参数tag暗示HtmlTextWriterTag列举值之一。大概读者关于HtmlTextWriterTag还不太熟习。它是一个列举范例,其列举值多为HTML标志,比方,A、B、Bold、Button等等。

  (3)protectedWebControl(stringtag)

  利用此机关函数可创立并初始化利用指定的HTML标志的WebControl类的新实例。个中参数tag暗示HTML标志。当利用该机关函数时必定要注重:不克不及间接挪用此机关函数。相反,它一般由派生类的机关函数挪用以初始化TagKey和TagName属性。

  在懂得了WebControl类的机关函数以后,读者还必需懂得WebControl类的一些经常使用属性和办法。上面枚举了这些经常使用成员工具,它们关于完成控件出现有侧重要意义。

  (1)Attributes属性

  该属性用于猎取与控件的属性不合错误应的恣意特征(只用于出现)的汇合,其属性范例为AttributeCollection。

  (2)ControlStyle属性

  该属性用于猎取服务器控件的款式,它是Style范例。ControlStyle属性封装WebControl类的一切表面属性,如BorderColor和Font。

  (3)TagKey属性

  该属性用于猎取与此服务器控件绝对应的System.Web.UI.HtmlTextWriterTag值,其属性范例为HtmlTextWriterTag列举。

  (4)protectedvirtualvoidAddAttributeToRender(HtmlTextWriterwriter);

  该办法将必要出现的HTML属性和款式增加到指定的System.Web.UI.HtmlTextWriter中。注重在重写过程当中,必定要挪用基类中响应的办法。

  (5)publicvoidApplyStyle(Styles);

  该办法将指定款式的一切非空缺元素复制到控件,改写控件的一切现有的款式元素。

  (6)publicvoidMergeStyle(Styles);

  该办法将指定款式的一切非空缺元素复制到控件,但不改写该控件现有的任何款式元素。

  (7)protectedoverridevoidRender(HtmlTextWriterwriter);办法

  该办法重写了Control.Render。

  (8)protectedvirtualvoidRenderContents(HtmlTextWriterwriter);

  该办法将控件的内容出现到指定的编写器中。假如要在控件的标签中写进文本或其他内容,则必要重写该办法;假如要利用默许逻辑来出现子控件,那末必定要挪用基类中响应的办法。

  大概读者已注重到WebControl基类中包含的两个办法:Render和RenderContents。依据上文所先容的内容可知,Control基类中包含Render办法。因为WebControl类承继自Control类,因而,WebControl类中包括Render办法是情有可原的。但是,WebControl类中却有一个RenderContents办法,而且该办法与Render办法在功效、参数等方面都十分类似。那末在出现控件过程当中究竟应当利用哪个呢?

  实践上,在一般情形下,假如服务器控件自WebControl基类派生,那末个中的Render办法很少利用,而次要利用RenderContents办法完成控件出现。为了申明个中的缘故原由,我们必需懂得WebControl基类中Render办法的完成逻辑。

  在WebControl基类中的Render办法的完成表示性代码以下所示:

protectedoverridevoidRender(HtmlTextWriteroutput)
{
 RenderBeginTag(output);
 RenderContents(output);
 RenderEndTag(output);
}
  在WebControl基类中的RenderBeginTag办法的完成表示性代码以下:

publicvirtualvoidRenderBeginTag(HtmlTextWriteroutput)
{
 AddAttributesToRender(output);
 HtmlTextWriterTagtagKey=TagKey;
 if(tagKey!=HtmlTextWriterTag.Unknown)
 {
  output.RenderBeginTag(tagKey);
 }else{
  output.RenderBeginTag(this.TagName);
 }
}
  在WebControl基类中的RenderContents办法的完成表示性代码以下:

protectedoverridevoidRenderContents(HtmlTextWriteroutput){
 //利用默许逻辑来出现子控件,那末必定要挪用基类中的办法。
 base.Render(output);
}
  剖析以上代码能够得出以下结论:

  1、为了在由WebControl派生的类中完成控件出现,必需重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等办法中的一个大概多个,而不用重写Render办法。

  2、重写AddAttributesToRender、RenderBeginTag、RenderEndTag、RenderContents等办法十分主要(请注重重写这些办法的前提及注重事项),不然服务器控件大概会呈现丧失标签的情形,这将严峻影响服务器控件的出现。

  3、当出现服务器控件标签中的内容时,必需重写RenderContents办法。

  上文先容了WebControl类的一些基础常识。特别是关于上文所枚举的表示性代码必要重点了解。这关于完成控件出现有侧重要感化。
<P>  使用示例

  信任读者在扫瞄各个网站时,常常会看到"接洽我们"等相似笔墨。当单击这些笔墨时,操纵体系将主动翻开本身所带的邮件客户端软件,提醒用户发送邮件。本例将完成一个自界说服务器控件RenderContentsControl,其用于经由过程出现包括"mailto:邮件地点"的超链接。本例的示例最终效果如所示:



  如所示,页面中出现了超链接笔墨"我的邮箱地点"。当单击该链接,体系将发送邮件给"my@mysample.com"。

  在完成以上控件之前,起首应剖析以下:本控件包括表面元素,比方,笔墨巨细、色彩、是不是粗体等。为此,控件基类不该从Control类承继,而应从WebControl类承继。如许,开辟职员将不用自行完成这些表面款式属性等外容。

  上面枚举了完成自界说服务器控件的RenderContentsControl.cs文件源代码。

usingSystem;
usingSystem.ComponentModel;
usingSystem.Security;
usingSystem.Security.Permissions;
usingSystem.Web;usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
namespaceUsingRenderContentsControl{
[
 AspNetHostingPermission(SecurityAction.Demand,Level=AspNetHostingPermissionLevel.Minimal),
 AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHostingPermissionLevel.Minimal),  DefaultProperty("Email"),ParseChildren(true,"Text"),
 ToolboxData("<{0}:RenderContentsControlrunat=server></{0}:RenderContentsControl>")
]

 publicclassRenderContentsControl:WebControl{
  //完成Email属性
  
  
  

  publicstringEmail
  {
   get{
    Strings=(String)ViewState["Email"];
    return((s==null)?String.Empty:s);
   }
   set{
    ViewState["Email"]=value;
   }
  }
  //完成Text属性

  [
   Bindable(true),Category("Appearance"),DefaultValue(""),Localizable(true),
   PersistenceMode(PersistenceMode.InnerDefaultProperty)
  ]

  publicvirtualstringText
  {
   get{
    strings=(string)ViewState["Text"];
    return(s==null)?String.Empty:s;
   }
   set{
    ViewState["Text"]=value;
   }
  }
  //重写TagKey属性

  protectedoverrideHtmlTextWriterTagTagKey
  {
   get{
    returnHtmlTextWriterTag.A;
   }
  }

  //重写AddAttributesToRender办法

  protectedoverridevoidAddAttributesToRender(HtmlTextWriterwriter)
  {
   base.AddAttributesToRender(writer);
   writer.AddAttribute(HtmlTextWriterAttribute.Href,"mailto:"+Email);
  }

  //重写RenderContents办法

  protectedoverridevoidRenderContents(HtmlTextWriterwriter)
  {
   if(Text==String.Empty){
    Text=Email;
   }
   writer.WriteEncodedText(Text);
  }
 }
}
  如上代码所示,RenderContentsControl类承继自WebControl基类,其缘故原由在前文已申明。别的,在RenderContentsControl类的完成过程当中,还包含了元数据属性标志、3个属性(Email、Text和TagKey)和2两个办法(AddAttributesToRender和RenderContents)完成等外容。上面一一对这些内容举行剖析。<P>  代码申明之3个属性:

  在上文代码中次要包含了3个属性:Email、Text和TagKey。Email属性用于猎取大概设置详细的电子邮件地点,Text属性用于猎取大概设置控件显现的文本内容。在这两个属性完成中,都利用了控件视图形态ViewState。服务器控件的视图形态为其一切属性值的累计。关于复杂属性的完成,将常常利用ViewState。TagKey属性是重写属性,其承继自WebControl基类,这是读者必要了解的重点内容。重写TagKey属性次要是为了出现HTML标志中的a元素,如许就不会出现WebControl类所默许出现的span元素。此处,也表示了本控件利用的机关函数是承继自WebControl的protectedWebControl(),读者可前往上文再看看有关这个机关函数的申明。必要读者切记的是:假如要出现的元素是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

  该办法用于为控件增加一个Href属性,并将该属性值设置为"mailto:Email",个中Email是上文所述的暗示邮件地点的属性。当重写AddAttributesToRender办法时,应一直依照控件源代码演示的体例:起首,挪用基类办法,然落后行相干设置。如许才干完成为服务器控件增加款式和其他属性的功效。实践上,依据前文所述的RenderBeginTag办法的完成表示性代码可知,AddAttributesToRender办法是由WebControl的RenderBeginTag办法挪用。

  (2)RenderContents

  该办法是本示例的中心内容,其用于在控件的标志中写进由Text属性指定的超链接文本。如代码所示,服务器控件挪用了HtmlTextWriter实例的WriteEncodedText办法,以对开辟职员输出的文本举行HTML编码。一样平常情形下,为了平安起见,应当对用户供应的文本举行HTML编码。

  代码申明之元数据属性标志:

  元数据属性标志在类前和属性完成前都有所使用。有关这些元数据属性标志的申明,在之前的文章中已举行了详细申明。读者可查阅有关解说怎样创立一个复杂的服务器控件的文章。上面重点申明一下有关外部文本耐久性的成绩。

  在类前的元数据属性标志中,设置了ParseChildren(true,"Text")。在Text属性前的元数据属性标志中,设置了PersistenceMode(PersistenceMode.InnerDefaultProperty)。经由过程以上两个设置,则为控件增加了外部文本耐久性设置。云云设置,可以使得开辟职员可以在控件标志代码内设置Text属性。比方:

<Sample:RenderContentsControlrunat="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告诉计划器是不是应将服务器控件的子控件作为嵌套的外部控件保留。false参数唆使外部内容与属性对应,而不是与子控件对应。ParseChildren已在上一段中加以申明。假如WebControl类的计划时和剖析时耐久性合用于您的控件,则不用重写从WebControl承继的PersistChildren和ParseChildren。

  上面枚举了用于测试服务器控件的Default.aspx文件源代码:

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>
<%@RegisterTagPrefix="Sample"Assembly="UsingRenderContentsControl"Namespace="UsingRenderContentsControl"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headid="Head1"runat="server">
<title>利用RenderContents办法完成控件出现</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<Sample:RenderContentsControlrunat="server"ID="CustomerControl"Font-Bold="true"Font-Size="small"ForeColor="Blue"Email="my@mysample.com">我的邮箱地点</Sample:RenderContentsControl>
</div>
</form>
</body>
</html>
  如上粗体代码所示,RenderContentsControl控件中设置了Font-Bold、Font-Size、ForeColor、Email等属性,同时,还在控件标志之间设置了文本内容。固然,假如开辟职员将Text属性值设置为不异的文本内容也是能够的。以上代码对照复杂,在此不再申明了。

  经由过程这个示例,我们必要重点把握RenderContents和AddAttributesToRender办法,和TagKey属性的利用。提请读者注重的是固然服务器控件的代码对照庞大,可是布局很复杂。切不成被庞大的款式设置和客户端举动代码弄得手足无措,而是要注重体味两个重点办法的利用历程。

  在服务器控件开辟乐成以后,最好可以检察其HTML代码,并将服务器代码和HTML代码作以对照,弄分明每条服务器控件代码出现了甚么样的HTML代码。经由过程这个办法,信任读者可以对服务器控件的出现办法有加倍深入的体味。上面枚举了当用户在扫瞄器中运转以上页面,并检察相干的Html源文件时可失掉的代码:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headid="Head1">
<title>利用RenderContents办法完成控件出现</title>
</head>
<body>
<formname="form1"method="post"action="Default.aspx"id="form1">
<div>
<inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value="/wEPDwULLTEyNTQwNjQyMDJkZOlJ3PyMGs2hmzn9MU6Ogt9V+5ag"/>
</div>
<div>
<aid="CustomerControl"href="mailto:my@mysample.com"style="color:Blue;font-size:Small;font-weight:bold;">我的邮箱地点</a>
</div>
</form>
</body>
</html>
  经由过程察看以上代码可知,自界说服务器控件RenderContentsControl实践出现的了局是粗体所示部分的代码,其终极出现为一个暗示超链接的<a>标志,个中包含href、Style和文本等属性值。它们的值与Default.aspx文件源代码中,RenderContentsControl控件的属性设置有着亲切干系。比方,Email属性值终极出现为href属性值等等。读者可自行对比检察,这关于了解控件出现很无益处。

  小结

  本文次要先容了WebControl类的一些基础常识,而且使用这些基础常识创立了一个复杂的控件出现实例。实践上,从中读者应当可以总结出来,创立承继自WebControl基类的自界说服务器控件,个中最为主要的重写RenderContents办法。记着这一点长短常主要的。至此,笔者已使用两篇文章来先容完成控件出现的办法。在今后的文章中,将先容有关为控件完成属性等方面的内容。据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。

简单生活 发表于 2015-1-17 12:15:33

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

因胸联盟 发表于 2015-1-20 18:37:10

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

变相怪杰 发表于 2015-1-29 14:39:23

ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。

小妖女 发表于 2015-2-6 02:04:29

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!

飘灵儿 发表于 2015-2-14 22:24:52

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

只想知道 发表于 2015-3-4 10:45:00

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

柔情似水 发表于 2015-3-11 18:24:43

ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。

admin 发表于 2015-3-19 07:22:34

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

小女巫 发表于 2015-3-27 13:08:50

ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
页: [1]
查看完整版本: ASP.NET网页设计ASP.NET服务器控件之RenderContents