默认有一个类Class1,但头部没有对WebControls的引用,要加上using System.Web.UI.WebControls;
把默认Class1继承自WebControl
这样就可以写出如下代码:
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.WriteLine("Hello World");
}
编译生成
切换到Web 应用程序,添加引用,项目,选择前面刚才的项目
这里,我一直没办法让它出现在工具箱中(但有时又会,原因不知道。如果我们加的是ASP.NET 服务器控件,WebCustomControl,就会自动多出一个栏及一个图标)
对默认的Default.aspx进行编辑
先要在头部输入如下代码:
<%@ Register Assembly="ClassLibrary1" Namespace="ClassLibrary1" TagPrefix="cc1" %>
然后在HTML中输入<cc1:即可智能提示相应内容
完整输入的内容为:<cc1:Class1 ID="Class11" runat="server" />
知识点:
<%@ Register Assembly="ClassLibrary1" Namespace="ClassLibrary1" TagPrefix="cc1" %>的含义:
注册用户控件,建立别名。
TagPrefix为命名空间的别名,如果改为其它内容,要等一下HTML中才能反映出来,并且不能为空,不能没有这一项。
Namespace为命名空间
Assembly为程序集,即编译后的DLL文件名
下次看到时,就不要不知道了。
<%@ Register %>只对当前页有效,如果对整个项目有效,则在web.config的system.web中注册
<pages>
<controls>
<add assembly="ClassLibrary1" namespace="ClassLibrary1" tagPrefix="cc2" />
</controls>
</pages>
如果页面也注册不同的别名,则该页面两个别名都可以用,如下:
<cc1:Class1 ID="Class11" runat="server" />
<cc2:Class1 ID="Class12" runat="server" />
不过别名的提示没有那么灵敏好像。都要等一会才会出来。
Page间接继承自Control类,Control的RenderControl()方法默认逻辑为判断Control.Visible属性,为True,则调用Render()方法,而Render()方法除了生成自己的内容外,还调用RenderChildren()方法触发所有子控件,子控件又RenderControl()->Render()->RenderChildren()
我在Default.aspx中上加一个这样控件:
<cc1:Class1 ID="Class11" runat="server" Visible="false" />
运行结果真的是没出来了
然后再把控件override的内容由Render改为RenderControl,结果真的Visible="false"就不起效果了。