mapserver

简单的生活,简单的编程(Code Snippet Storage 2 进行中... ...)。

导航

统计

公告

未经许可,请不要转载我的文章。

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类(13)

文章分类(21)

My Links

积分与排名

最新评论

Asp.net服务器控件编程(4) 呈现

        当用户向请求一个页面时,服务器端会向客户端发送一段文本,包括可显示标记字符和不可显示的文本,当这段文本到达客户端后,再通过客户端的浏览器(如IE)把可视化的标记字符转化为可视呈现给用户,所以在用户请求一个aspx页面时,页面上的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方法负责生成控件的子控件。
        我们以一个例子来说明这个过程。
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(RenderControl—〉Render—〉RenderContents—〉RenderChildren):
        
        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比较熟悉的朋友。
    }

}
        如果在本文中发现有什么不妥的地方,请朋友们给与指点,小弟在此先谢过。       

posted on 2006-07-03 00:14 mapserver 阅读(2655) 评论(14)  编辑 收藏 网摘 所属分类: Asp.net 服务器端控件

评论

#1楼 2006-07-03 09:37 世界杯来了[未注册用户]

不错啊,我看了你的“组件编程”,写的真的很不错。
Asp.net服务器控件编程,写篇关于“复杂属性”的啊,还有子控件的。
顺便问一句,lz是不是就是csdn里“组件、控件”版的版主?
  回复  引用    

#2楼 2006-07-03 09:47 Nina      

收藏可以不   回复  引用  查看    

#3楼[楼主] 2006-07-03 10:10 mapserver      

@世界杯来了
复杂属性和子控件会在后面陆续讲解,敬请关注。
csdn里“组件、控件”版的版主正式在下。

@Nina
当然可以。
  回复  引用  查看    

#4楼 2006-07-03 13:12 freewiller      

好东西了 学习了   回复  引用  查看    

#5楼 2006-07-24 12:00 javabeanzhang[未注册用户]

楼主你好:
public override void RenderControl(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("RenderControl<br>");
base.RenderControl(writer);
}

这个方法在WebControl中好像不是Virtual的啊
[C#]
public void RenderControl(
HtmlTextWriter writer
);

继承WebControl的时候,是不允许重写 RenderControl(HtmlTextWriter writer)的啊 ,请楼主明示。。。
  回复  引用    

#6楼 2006-07-28 15:29 啊啊[未注册用户]

你就像在天上,我在地狱.

人和人杂这大差别呢?

看你的文章真他妈舒服,明了
  回复  引用    

#7楼[楼主] 2006-07-29 21:18 mapserver      

哈,不至于吧,最近太忙,没有时间更新。   回复  引用  查看    

#8楼 2006-09-17 10:17 小镇姑娘她爹[匿名][未注册用户]

写的真好,我对您的敬仰犹如滔滔江水,连绵不绝;黄河泛滥,一发而不可收拾!!!   回复  引用    

#9楼 2007-09-10 16:21       

lz,关于属性标记和重载的AddAttributesToRender(HtmlTextWriter writer)方法有什么不一样的吗?因为我看MSDN的示例上似乎用的是AddAttributesToRender方法。
而属性也是重载的HtmlTextWriterTag属性。
我看的是asp.net2.0不知道是不是和lz的一样。
  回复  引用  查看    

#10楼 2007-09-10 16:23       

另外楼主这几篇写的实在是太棒了。我收藏下,没问题吧。   回复  引用  查看    

#11楼 2008-02-25 17:34 欲静不止[未注册用户]

楼主收我为徒弟把!师傅在上受徒弟一摆   回复  引用    

#12楼 2008-03-09 00:46 doo[未注册用户]

Render()方法是Control里。Control基类适合派生没有样式的控件。RenderContents是WebControl里的,用于有样式的控件的布局控制。如果你的控件呈现比较复杂,要样式及布局支持那么用这个方法好,前提是你的控件派生于WebControl基类。至于RenderControl方法则是进行判断Visiblen属性,为True的话调用Render()。
Render()则生成自已的内容和调用RenderChildren()来生成子控件.所以我认为顺序是RenderControl()---Visible-->Render()---->RenderChilden()--->(RenderControl()--->Render()---->RenderChilden()).....()....()来递归生成控件树。
  回复  引用    

#13楼 2008-05-17 10:22 nick-yan[未注册用户]

怎样给自定义控件添加一个ValidationGroup属性呢   回复  引用    

#14楼 2008-11-12 11:37 传说中的宝玉      

学习了 谢谢   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 441072 xU1MjM0tJ1c=



相关文章:

相关链接: