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

推荐订阅源

S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
P
Palo Alto Networks Blog
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Blog — PlanetScale
Blog — PlanetScale
S
Schneier on Security
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
雷峰网
雷峰网
T
Tenable Blog
人人都是产品经理
人人都是产品经理
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Scott Helme
Scott Helme
SecWiki News
SecWiki News
C
CERT Recently Published Vulnerability Notes
Recorded Future
Recorded Future
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
Help Net Security
Help Net Security
Cloudbric
Cloudbric
C
Check Point Blog
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
腾讯CDC
量子位
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
Kaspersky official blog
Vercel News
Vercel News
F
Full Disclosure
T
Troy Hunt's Blog
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs

博客园 - 小乔的闺房

学习ID,ClientID,UniqueID 基础知识1 (2)最简单的Remoting程序 (1)将对象序列化为bin,soap,xml (4)迭代器 (3)集合接口 (1)学习数组,集合,IEnumerable接口,引申学习迭代器 (2)学习集合,引申学习索引器和泛型 FindControl实现原理 location详解 使用ASP.NET AJAX实现(图片)幻灯片效果 固定GridView列字符串长度,多于的用...代替 读取Excel数据到GridView相关问题(待完善) 说明nchar(10),char(10),nvarchar(10),varchar(10) syscolumns 获得数据库里所有表的名称 类[属性扩展],属性[属性扩展](待完善) 获得数据库表的列数 WebForm里弹出警告框之内的自定义类MessageBox
自定义服务器控件(1)整体把握(未完待续)
小乔的闺房 · 2007-10-30 · via 博客园 - 小乔的闺房

(1)自定义服务器控件继承下面3个类之一
Control
WebControl
CompositeControl

1.1 Control呈现过程
语法

[BindableAttribute(true)]
[ThemeableAttribute(false)]
public class Control : IComponent, IDisposable, IParserAccessor,
    IUrlResolutionService, IDataBindingsAccessor, IControlBuilderAccessor, IControlDesignerAccessor, IExpressionsAccessor
说明
protected internal virtual void Render(HtmlTextWriter writer)
{
    this.RenderChildren(writer);
}
protected internal virtual void RenderChildren(HtmlTextWriter writer)
{
    ICollection children = (this._occasionalFields == null) ? null : ((ICollection) this._occasionalFields.Controls);
    this.RenderChildrenInternal(writer, children);
}
一般流程和ASP.net AJAX 1.0分歧就在这里了
internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
{
    //是Asp.net Ajax处理
    if ((this.RareFields != null) && (this.RareFields.RenderMethod != null))
    {
        writer.BeginRender();
        this.RareFields.RenderMethod(writer, this);
        writer.EndRender();
    }
    else if (children != null)
    {
        //不是Asp.net Ajax处理,将执行foreach依次对所有的子控件进行遍历
        foreach (Control control in children)
        {
            control.RenderControl(writer);//完成子控件的呈现过程
        }
    }
}
public virtual void RenderControl(HtmlTextWriter writer)
{
    this.RenderControl(writer, this.Adapter);
}

protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
{
    if (!this.flags[0x10] && !this.flags[0x200])
    {
        HttpContext context = (this.Page == null) ? null : this.Page._context;
        if ((context != null) && context.TraceIsEnabled)
        {
            int bufferedLength = context.Response.GetBufferedLength();
            this.RenderControlInternal(writer, adapter);
            int num2 = context.Response.GetBufferedLength();
            context.Trace.AddControlSize(this.UniqueID, num2 - bufferedLength);
        }
        else
        {
            this.RenderControlInternal(writer, adapter);
        }
    }
}

private void RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
{
    if (adapter != null)
    {
        adapter.BeginRender(writer);
        adapter.Render(writer);
        adapter.EndRender(writer);
    }
    else
    {
        this.Render(writer);
    }
}

1.2 WebControl呈现过程
语法

[ThemeableAttribute(true)]
public class WebControl : Control, IAttributeAccessor
说明
1 WebControl.Render方法
  (1)大多数情况下,自定义服务器控件开发人员需重写此方法.
  (2)重写了基类的Render,首先调用WebControl.RenderBeginTag方法,然后调用WebControl.RenderContents方法,最后调用WebControl.RenderEndTag方法来将控件发送到客户端.
2 WebControl.RenderContents方法
  (1)大多数情况下,自定义服务器控件开发人员需重写此方法.
  (2)呈现开始和结束标记之间的控件内容
3 WebControl.RenderBeginTag方法
  (1)
4 WebControl.RenderEndTag方法
  (1)

1.3 CompositeControl呈现过程
语法
public abstract class CompositeControl : WebControl, INamingContainer, ICompositeControlDesignerAccessor
说明
不得不说的3个方法
1 Control.EnsureChildControls方法
  (1)大多数情况下,自定义服务器控件开发人员不需重写此方法.
  (2)确定服务器控件是否包含子控件.如果不包含,则创建子控件.
  (3)该方法首先检查ChildControlsCreated属性的当前值.如果此值为假,则调用CreateChildControls方法.
2 Control.CreateChildControls方法
  (1)大多数情况下,自定义服务器控件开发人员需重写此方法.
  (2)由ASP.NET页面框架调用,以通知使用基于合成的实现的服务器控件创建它们包含的任何子控件,以便为回发或呈现做准备.
3 CompositeControl.Render方法
  (1)大多数情况下,自定义服务器控件开发人员需重写此方法.
  (2)将CompositeControl内容写入指定的HtmlTextWriter对象,以便在客户端上显示.
  (3)此方法重写基实现,以确保先创建Controls集合中的所有子控件,然后使用Control.Render和Control.RenderChildren基方法呈现控件及其所有子控件.