仓酷云

标题: ASP.NET网页设计ASP.NET2.0服务器控件之Render办法 [打印本页]

作者: 金色的骷髅    时间: 2015-1-16 22:39
标题: ASP.NET网页设计ASP.NET2.0服务器控件之Render办法
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着!asp.net|服务器|控件  控件出现是指向HTTP输入流中写进标志文本的历程。服务器经由过程HTTP输入流向客户端发送天生的标志文本,这些文本将会经由过程客户端扫瞄器转换为可视化的元素显现出来。利用控件出现,开辟职员能够将HTML标志、剧本代码、CSS款式表等等输出到客户端扫瞄器。完成服务器控件出现次要有两种体例:一是Control类的Render办法,二是WebControl的RenderContents办法。本文重点先容利用Control类的Render办法完成控件出现的使用。

  利用HtmlTextWriter类

  Control类的Render办法次要用于完成控件出现,其声明朝码以下:

protectedvirtualvoidRender(HtmlTextWriteroutput)
  如上代码所示,Render办法的参数是一个HtmlTextWriter范例。为了更好的使用Render办法,读者应起首懂得HtmlTextWriter类及其相干内容。

  依据MSDN2005的形貌,HtmlTextWriter类用于将标志字符和文本写进到ASP.NET服务器控件输入流。此类供应了ASP.NET服务器控件在向客户端出现标志时所利用的格局设置功效。为了完成类的功效,HtmlTextWriter类界说了多个字段、属性和办法。因为成员工具浩瀚,本文只选择了一些经常使用成员加以申明,同时,还将先容一些ASP.NET2.0的新增成员。

  经常使用成员工具包含:

  ・AddAttribute办法

  关于HtmlTextWriter工具经由过程对RenderBeginTag办法的后续挪用创立的元素,向其入手下手标志中增加指定的标志属性和值。

  ・AddStyleAttribute办法

  关于HtmlTextWriter工具经由过程对RenderBeginTag办法的后续挪用创立的元素,向其入手下手标志中增加标志款式属性。

  ・Write办法

  将指定命据范例连同任何挂起的制表符间距一同写进到输入流。

  ・WriteAttribute办法

  将标志属性及其值写进到输入流。

  ・WriteBeginTag办法

  任何制表符间距和指定标志元素的入手下手标志写进到输入流。

  ・WriteEndTag办法

  写进指定的标志元素的任何制表符间距和停止标志。

  ・Encoding属性

  猎取HtmlTextWriter工具用于将内容写进页的编码。

  ・Indent属性

  猎取或设置用以缩进每行标志的入手下手地位的制表符地位数。

  ・NewLine属性

  猎取或设置由HtmlTextWriter工具利用的行停止符字符串。

  关于初学者而言,倡议重点把握以上成员工具的使用。别的,ASP.NET2.0还为HtmlTextWriter类新增了一些成员,这些成员包含:

  ・BeginRender办法

  关照HtmlTextWriter工具或派生类的工具,某个控件将会出现。

  ・EndRender办法

  关照HtmlTextWriter工具或某个派生类的工具,某控件已完成出现。

  ・IsValidFormAttribute办法

  反省一个属性以确保它能够在<form>标志元素的入手下手标志中出现。

  ・WriteEncodedUrl办法

  对指定的URL举行编码,然后将它写进到输入流。URL能够包含参数。

  ・WriteEncodedText办法

  对哀求的设备的指定文本举行编码,然后将其写进到输入流。

  ・WriteBreak办法

  将<br/>标志元素写进到输入流。
<P>  利用Render办法完成控件出现

  1、基本常识

  本文所解说的Render办法从属于System.Web.UI.Controls.Control类。该类是创立服务器控件的基类,良多控件类均承继自该类。在Control类中包含三个用于完成控件出现的办法:Render、RenderChildren和RenderControl。它们都利用HtmlTextWriter的实例作为参数,它们同意为一个HtmlTextWriter工具供应服务器控件的内容,并将其内容封装至HTTP输入流中输入到客户端显现。上面复杂对这三个办法举行复杂先容。

  (1)protectedvirtualvoidRender(HtmlTextWriterwriter);

  该办法用于将服务器控件内容发送到供应的HtmlTextWriter工具,此工具编写将在客户端出现的内容。在开辟服务器控件时,能够重写此办法以出现服务器控件。

  (2)protectedvirtualvoidRenderChildren(HtmlTextWriterwriter);

  该办法用于将服务器控件子级的内容输入到供应的HtmlTextWriter工具,此工具编写将在客户端出现的内容。该办法关照ASP.NET出现页中的一切ActiveServerPages代码。假如页上没有任何ASP代码,此办法将出现服务器控件的一切子控件。

  (3)protectedvirtualvoidRenderControl(HtmlTextWriterwriter);和protectedvoidRenderControl(HtmlTextWriterwriter,ControlAdapteradapter)

  RenderControl有两个重载办法,它们都用于将服务器控件的内容输入到所供应的HtmlTextWriter工具中。假如已启用跟踪功效,则存储有关控件的跟踪信息。假如服务器控件的Visible属性设置为true,该办法将断定是不是启用页的跟踪功效。假如启用,它将存储与控件有关的跟踪信息,同时向页出现服务器控件的内容。别的,前一个重载体例是ASP.NET2.0从ASP.NET1.0中承继而言,后一个重载体例是ASP.NET2.0新增的。后者详细利用供应的ControlAdapter工具将服务器控件内容输入到供应的HtmlTextWriter工具。个中参数adapter是ControlAdapter范例,它用于界说出现的ControlAdapter。当完成在各类设备和扫瞄器中运转的服务器控件时,该办法对照经常使用。

  以上3个办法看起来仿佛是自力的3个办法,但是,实践上它们之间存在亲切的接洽。读者可经由过程浏览以下表示性代码,从而了解它们之间的干系。

//RenderCotrol办法基础完成
publicvoidRenderControl(HtmlTextWriteroutput)
{
 if(Visible)
 {
  Render(output);
 }
}
//Render办法基础完成
protectedvirtualvoidRender(HtmlTextWriteroutput)
{
 RenderChildren(output);
}
//RenderChildren办法基础完成
protectedvirtualvoidRenderChildren(HtmlTextWriteroutput)
{
 foreach(ControlcinControls)
 {
  c.RenderControl(output);
 }
}
  如上代码所示,个中枚举了RenderControl、Render、RenderChildren办法的完成思绪。不言而喻的是,在控件出现过程当中,这三个办法都在起着感化,并且利用了一个复杂的递回挪用历程。大致而言,能够了解为:

  (1)页面框架创建一个HtmlTextWriter类的实例;

  (2)页面框架将这个实例工具传送给RenderControl办法;

  (3)RenderControl办法反省控件的可视属性Visible是不是为true。假如为true,RenderControl办法将挪用Render办法;假如为false,则不出现该控件和其子控件;

  (4)Render办法实行默许完成,挪用RenderChildren办法;

  (5)RenderChildren办法依照默许完成中的设定挪用每一个子控件的RenderControl办法;

  实践上,假如读者短工夫内不克不及了解以上历程也没有很年夜的干系。关于初学者而言,关头是要记着最主要、最经常使用的是Render办法。控件开辟者能够经由过程重写Render办法完成出现控件的义务。

  2、示例使用

  上文先容了利用Control类的Render办法完成控件出现的基本常识。上面将经由过程一个典范示例,匡助读者开端了解Render的利用办法。示例效果如所示。

ASP.NET网页设计ASP.NET2.0服务器控件之Render办法
登录/注册后可看大图

最终效果
  如所示,该服务器控件出现了一个超链接,而且设置了文本为白色。当用户单击白色笔墨时,页面将转向微软站点。固然,用户能够经由过程属性LinkUrl来设置超链接地点。

  上面枚举了示例完成源代码。

usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Text;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
namespaceUsingRenderControl
{
 [DefaultProperty("LinkUrl")]
 [ToolboxData("<{0}:RenderControlrunat=server></{0}:RenderControl>")]
 publicclassRenderControl:Control
 {
  //完成LinkUrl
  [Bindable(true)]
  [Category("Appearance")]
  [DefaultValue("http://localhost/")]
  [Localizable(true)]
  publicstringLinkUrl
  {
   get{Strings=(String)ViewState["LinkUrl"];
    return((s==null)?String.Empty:s);}
   set{ViewState["LinkUrl"]=value;}
  }
  //重写Render办法
  protectedoverridevoidRender(HtmlTextWriterwriter)
  {
   writer.AddAttribute(HtmlTextWriterAttribute.Href,LinkUrl);
   writer.AddStyleAttribute(HtmlTextWriterStyle.Color,"red");
   writer.RenderBeginTag(HtmlTextWriterTag.A);
   writer.Write("扫瞄网站");
   writer.RenderEndTag();
  }
 }
}
  如上代码完成了自界说服务器控件类RenderControl。该类从Control基类承继,详细完成了暗示超链接地点的LinkUrl(默许值为http://localhost/),偏重写了Render办法。在重写Render的过程当中,挪用了一些HtmlTextWriter类成员,比方,Writer、AddAttribute、AddStyleAttribute、RenderBeginTag和RenderEndTag办法等。别的,大概开辟职员在利用Writer办法过程当中,必要出现一个对照长的字符串。倡议此时多多利用Writer办法,而不要利用字符串级联大概StringBuilder类的相干办法举行完成。由于,那样将会损耗大批的体系工夫和内存,效力较低。
<P>  大概有一些读者会问,假如将服务器控件出现的多行代码的按次变更一下,是不是会有甚么分歧呢?比方,假定起首顺次使用RenderBeginTag、Write、RenderEndTag办法,然后再挪用AddAttribute和AddStyleAttribute办法,那末会显现不异的效果吗?谜底是不是定的。这里必要夸大的是:在出现控件的过程当中,起首要界说服务器控件的属性和CSS款式等外容,然后再界说服务器控件的主体内容,这类按次不克不及改动的。

  别的,假如读者感乐趣能够在代码中完成一个Text属性,用于猎取大概设置控件所显现的文本。如许,在Render办法中,利用Write办法输入的"扫瞄网站"笔墨内容则可由Text属性取代。

  上面枚举了为利用以上的自界说服务器控件,而创立的Default.aspx文件源代码。

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>
<%@RegisterTagPrefix="Sample"Assembly="UsingRenderControl"Namespace="UsingRenderControl"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>利用Render办法完成控件出现</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<Sample:RenderControlrunat="server"ID="CustomerControl"LinkUrl="http://www.microsoft.com/">
</Sample:RenderControl>
</div>
</form>
</body>
</html>
  以上代码对照复杂,个中次要声了然自界说服务器控件RenderControl,并设置其LinkUrl属性值为http://www.microsoft.com,即微软站点地点。

  当用户在扫瞄器中运转以上页面,并检察相干的Html源文件时,可失掉以下的代码:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title>利用Render办法完成控件出现</title>
</head>
<body>
<formname="form1"method="post"action="Default.aspx"id="form1">
<div>
<inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value="/wEPDwUJNzMyMTY5NTU2ZGQQYrLd/G+vm1h41r2CEkxID63o5g=="/>
</div>
<div>
<ahref="http://www.microsoft.com/"style="color:red;">扫瞄网站</a>
</div>
</form>
</body>
</html>
  经由过程察看以上代码可知,自界说服务器控件RenderControl实践出现的了局是粗体所示部分的代码,其终极出现为一个暗示超链接的<a>标志。

  小结

  本文起首先容了HtmlTextWriter类的基础常识,然后解说了利用Render办法完成控件出现的使用。在随后的一篇文章中,笔者将申明别的一种完成控件出现的办法。从服务器控件开辟手艺整体而言,控件出现手艺是开辟过程当中最为经常使用,也是最为复杂的内容。倡议读者可以纯熟把握个中的内容。
完全不一样的。.net其实我也说不太清,.net可以把他理解为跟J2EE相对的工具。c++主要做系统相关的开发你要学.net的话就应该学C#。(其实微软在.NET平台上也考虑了给C++留一个地位。
作者: 仓酷云    时间: 2015-1-19 20:41
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
作者: 飘灵儿    时间: 2015-1-28 10:25
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
作者: 再见西城    时间: 2015-2-5 20:09
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
作者: 谁可相欹    时间: 2015-2-13 11:11
那么,ASP.Net有哪些改进呢?
作者: 柔情似水    时间: 2015-3-3 20:36
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
作者: 再现理想    时间: 2015-3-11 13:19
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
作者: 若天明    时间: 2015-3-18 13:01
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
作者: 不帅    时间: 2015-3-25 22:11
现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2