自定义服务器控件(1)整体把握(未完待续)
(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基方法呈现控件及其所有子控件.