当用户向请求一个页面时,服务器端会向客户端发送一段文本,包括可显示标记字符和不可显示的文本,当这段文本到达客户端后,再通过客户端的浏览器(如IE)把可视化的标记字符转化为可视呈现给用户,所以在用户请求一个aspx页面时,页面上的Asp.net服务器控件,也会把文本写入到返回的文本流中,在本章中我们将讲述这一过程,学习ASP.NET服务器控件编程的相关知识。
ASP.NET服务器控件编程提供了4个有关呈现的方法,分别是Render、RenderChildren、RenderContents和RenderControl,这4个方法都有一个HtmlTextWriter类型的参数。HtmlTextWriter的作用就是把标记字符和文本写入倒Asp.net服务器控件流中,它是System.Web.UI名称空间所有标记编写器的基类,包括ChtmlTextWriter、Html32TextWriter和XhtmlTextWriter,这些类用于针对不同的标记类型编写元素、属性、样式和布局信息。
既然有4个有关呈现的方法,那它们的作用分别是什么?它们之间有什么区别呢?我们以一个控件的生成过程来说明:
每个页面都有一个控件树,代表本页面所拥有的所有子控件,页面控件就是控件树的根,为了生成控件树,页面将建立一个HtmlTextWriter类的实例;在这个实例中封装了相应流,接着页面会把HtmlTextWriter对象传递给RenderControl,RenderControl会检查控件的Visible属性是否为真,如果是真,RenderControl会调用Render方法,而Render方法会去调用RenderContents,RenderContents方法负责将控件的内容呈现到指定的编写器中,如果控件有子控件的话,Render方法又会把HtmlTextWriter传递给RenderChildren方法,RenderChildren方法负责生成控件的子控件。
我们以一个例子来说明ASP.NET服务器控件编程的过程。
public class Class1 : WebControl
{
protected override void Render
(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("RenderChildren〈br 〉");
base.Render(writer);
}
protected override void RenderChildren
(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("RenderChildren〈br 〉");
base.RenderChildren(writer);
}
public override void RenderControl
(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("RenderControl〈br 〉");
base.RenderControl(writer);
}
protected override void RenderContents
(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("RenderContents〈br 〉");
base.RenderContents(writer);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
效果如下的图1(RenderControl—〉Render—〉RenderContents—〉RenderChildren):
在ASP.NET服务器控件编程中HtmlTextWrite的各种方法的参数取值用到三种枚举类型:HtmlTextWriteTag、HtmlTextWriteAttribute和HtmlTextWriteStyle,在这里不作详细的讲解,举例如下,效果如上图的图2:
[DefaultProperty("Text")]
[ToolboxData("〈{0}:WebCustomControl1
runat=server〉〈/{0}:WebCustomControl1〉")]
public class WebCustomControl1 : WebControl
{
protected override void Render
(HtmlTextWriter output)
{
// -----------------------------------------
// ***种方式,通过Add + [Attribute、
StyleAttribute、BeginTag\EndTag]
// AddAttribute、AddStyleAttribute
在RenderBeginTag和RenderEndTag之前
output.BeginRender(); // 开始Render
output.AddAttribute(HtmlTextWriterAttribute.
Value, "This is input.");
// 使用HtmlTextWriteAttribute枚举
output.AddStyleAttribute(HtmlTextWriterStyle.
BackgroundColor, ColorTranslator.ToHtml
(Color.GreenYellow));
// 使用HtmlTextWriteStyle枚举
output.RenderBeginTag(HtmlTextWriterTag.Input);
// 使用HtmlTextWriteTag枚举
output.RenderEndTag();
output.EndRender(); // 结束Render
// ------------------------------------------
// -------------------------------------------
// 第二种方式,通过Write + [Attribute、
StyleAttribute、BeginTag\EndTag]
// WriteAttribute、WriteStyleAttribute
在WriteBeginTag和WriteEndTag之间
output.WriteBeginTag("input");
// 直接标记的名称,不使用HtmlTextWriteTag枚举
output.WriteAttribute("value", "This is input too.");
// 直接使用属性名称,不使用HtmlTextWriteAttribute枚举
output.Write(" style=\"");
output.WriteStyleAttribute("background-color",
ColorTranslator.ToHtml(Color.Lavender));
// 直接使用样式标记,不使用HtmlTextWriteStyle枚举
output.Write("\"");
output.Write(HtmlTextWriter.TagRightChar); // 添加“〉”标记
output.WriteEndTag("input");
// -----------------------------------------------
// 第二种适用于对html比较熟悉的朋友。
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
【编辑推荐】