惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Heimdal Security Blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
J
Java Code Geeks
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
V
V2EX
WordPress大学
WordPress大学
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
AI
AI
小众软件
小众软件
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
A
Arctic Wolf
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
F
Full Disclosure
B
Blog RSS Feed
Forbes - Security
Forbes - Security
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
Cisco Talos Blog
Cisco Talos Blog
U
Unit 42
Project Zero
Project Zero
H
Hacker News: Front Page
Y
Y Combinator Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
S
Secure Thoughts
The Hacker News
The Hacker News
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - mapserver

MicroOrm.Net和现有ORM产品的对比 MicroOrm.Net(8) Table.Query() - Distinct、Skip & Take MicroOrm.Net(7) Table.Query() - Group By & Having MicroOrm.Net(6) Table.Query() - Join & Order By MicroOrm.Net(5) Table.Query() - Select MicroOrm.Net(4) Table.Query() - Where MicroOrm.Net(3) Database、Table、Column、Expression、Math&MathE MicroOrm.Net(2) 基础及动态特性 MicroOrm.Net(1) 总览 Asp.net服务器控件编程(6) ViewState(二)——ViewState用法和IStateManager Asp.net服务器控件编程(5) 复杂属性 Asp.net服务器控件编程(3) ViewState(一)——asp.net控件的精华之一 Asp.net服务器控件编程(2) 来做个热身运动吧 Asp.net服务器控件编程(1) 开篇、基础 Asp.net服务器控件编程 总览 TextDataSource(3) — 请把我的数据更新回去 TextDataSource(2) — 翠花,上“数据” TextDataSource(1) — DataSourceControl内幕 .NET组件编程(10) 补充 ISupportInitialize
Asp.net服务器控件编程(4) 呈现
mapserver · 2006-07-03 · via 博客园 - mapserver

        当用户向请求一个页面时,服务器端会向客户端发送一段文本,包括可显示标记字符和不可显示的文本,当这段文本到达客户端后,再通过客户端的浏览器(如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比较熟悉的朋友。
    }

}

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