- 热门文章:
- · 利用ASP.NET 2.0创建自定义Web控件(4)
- · 利用ASP.NET 2.0创建自定义Web控件(5)
- · 在ASP.NET下实现数字和字符相混合的验证码
- · 生成图象验证码函数
- · 在ASP.NET 2.0中使用页面导航控件(1)
- · 在ASP.NET 2.0中使用页面导航控件(2)
- · DataGrid基于Access的快速分页法(1)
- · DataGrid基于Access的快速分页法(2)
- · DataGrid基于Access的快速分页法(3)
- · DataGrid基于Access的快速分页法(4)
- · ASP.NET中对表单输入行有选择验证(1)
- · ASP.NET中对表单输入行有选择验证(2)
上一篇:利用ASP.NET 2.0创建自定义Web控件(2) >>
利用ASP.NET 2.0创建自定义Web控件(3)
请注意,用于两个属性的 Get 和 Set 方法都利用 ViewState 对象。ViewState 对象是一个内置到 WebControl 类中的帮助器对象。从开发角度讲,ViewState 可被视为一个集合类,用于存储在回发过程中我们想要保留的任意属性。实际上,ViewState 封装了确定如何执行持久性(使用 Cookie、会话等等)所需的所有代码和逻辑。
生成控件
在定义了控件属性之后,接下来的步骤就是要设计将由控件发出的实际响应。在 MailLink 示例中,我们希望设计控件来生成基本的 HTML 标记。
TagKey
WebControl 的默认实现会生成一个 标记。我们的 MailLink 控件通过为 TagKey 属性提供它自己的实现来覆盖该默认实现。TagKey 属性定义将要封装控件内容的最外面的标记。
幸运的是,我们可以使用 HtmlTextWriterTag 枚举来指示链接 标记,而不必实际编写 HTML 文本。该枚举方法用于最常用的 HTML 标记。
protected override HtmlTextWriterTag TagKey {
get {
return HtmlTextWriterTag.A;
}
}
如果您需要生成一个不属于 HtmlTextWriterTag 枚举的一部分的标记,您必须覆盖 WebControl.TagName 属性,而非 TagKey 属性。TagName 属性会返回由控件生成的实际 HTML 标记字符串。TagName 的默认 WebControl 实现只调用 TagKey,并以完美的提取方式提取正确的 HTML。
AttributesToRender
在定义了基本标记之后,接下来的步骤就是分配我们要添加到该标记中的各种特性。我们的 MailLink 控件将覆盖 AddAttibutesToRender 方法以便为“mailto”标记添加适当的标记。
protected override void AddAttributesToRender(
HtmlTextWriter writer){
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href,
"mailto:" + Email);
}
对基类的 addAtributeToRender() 调用会被调用,以确保可以正确生成其他样式和特性。如果我们忽略该基本调用,我们可能会失去内置到所有 Web 控件中的母版页设计、筛选器或其他功能。
RenderContents
最后,由于所需的 WebControl 类的方法和属性都已被覆盖,因此可以使用 RenderContents 方法来编写文本。出于安全原因,MailLink 使用 HtmlTextWriter.WriteEncodedText 方法编写 HTML 编码输出。HTML 编码安全地将潜在的危险字符转换为更安全的表示形式。
protected override void RenderContents(
HtmlTextWriter writer) {
if (Text == String.Empty) {
Text = Email;
}
writer.WriteEncodedText(Text);
}
请注意,我们只生成 Text 属性。如果 Text 属性为空,我们将利用 Email 属性填充它。请记住,Text 属性旨在用作控件标记的内部文本。这种类型的控件至少需要某一可显示的文本(以便用户进行单击)。如果我们试图生成一个空字符串,我们将失去链接标记的预期功能。
如何生成的?
Render() 方法基本上控制着 WebControl 的整个输出。默认情况下,Render() 方法实际上会依次调用 RenderBeginTag()、RenderContents() 以及 RenderEndTag()。尽管在 ASP.net 1.x 中调用结构并未变化,但由于该呈现模型,修改这些调用的影响却发生了变化。
您可以覆盖 Render() 方法来发出您想要的任何内容。换句话说,您可能已经跳过了覆盖 TagKey 属性、AttributestoRender 属性和 RenderContents() 方法,并且仅使 Render() 编写“text”。但是,这种做法可能会严重影响自适应呈现。如果重写 Render() 来直接发出最终输出,您会绕过内置到 WebControl 类中的大多数自适应呈现特性。
自适应呈现模型和各种适配器的作用是:截获对各种标记方法的调用并转换特定设备的输出。在 MailLink 的特定示例中,几乎所有的标记语言都支持用于 链接的相同语法。但是,其他标记通常在不同的标记语言中会有截然不同的转换。如果我们为这样的标记使用了 Render(),我们的控件将只能在某些浏览器上使用,而适配器无法更改该行为。通过设计控件以使用自适应元素而不是使用 Render(),您可以让 ASP.NET 框架有机会根据浏览器提供在浏览器上的呈现服务。
使用自定义控件
自定义控件能够以很多方法包括在 Web 应用程序中。标准方法是将自定义控件编译到一个程序集中,然后在使用该控件的所有 Web 应用程序中添加一个对该程序集的引用。
使用 EmailLink
为了使用 EmailLink 控件,您需要:
1.将 MyControls 项目编译到一个程序集中。
图 3. 编译包含 EmailLink 控件的 MyControls 命名空间
2.在新的 Web 项目中添加一个对已编译程序集的引用。
图 4. 编译应用程序并添加一个引用
在正确添加引用之后,自定义控件应该出现在工具箱中的“MyControls Components”下。
图 5. 工具箱中的 EmailLink
MyControls 程序集中的所有组件都使用默认的齿轮图标,因为我们未曾在每个控件上设置特定的图标。设置图标如同在该控件类上调整图标属性那样简单。
下一篇:利用ASP.NET 2.0创建自定义Web控件(4) >>
相关文章:
- · Javascript利用xmlhttp获得服务器时钟的方法
- · 用ASP编写的俄罗斯方块游戏
- · 复选框用法
- · 复选框用法
- · [漏洞]利用Activer server explorer可对文件进行读写访问
- · 给你的FSO对象加把锁
- · ASP有函数可以把某个网页通过STREAM下载吗?
- · 控制输出字符串的长度,可以区别中英文
- · 存储过程编写经验和优化措施
- · ASP.NET入门随想之工业流水线
- · ASP.NET入门随想之抽象的力量
- · ASP.NET入门随想之瘦子与胖子的故事
- · ASP.NET入门随想之开卷有益
- · ASP.NET中随机数生成及应用(2)
- · ASP.NET中随机数生成及应用(1)
- · ASP.NET中实现Flash与.NET的紧密集成(1)
- · ASP.NET中实现Flash与.NET的紧密集成(2)
- · 深度解析ASP.NET2.0中的Callback机制(1)
- · ASP.NET+AJAX解决网页打开等待问题(1)
- · ASP.NET+AJAX解决网页打开等待问题(2)
- · C#中为DataGrid添加下拉列表框
- · ASP.NET开发员工业绩评测中心(1)
- · ASP.NET开发员工业绩评测中心(2)
- · 在ASP应用程序中限制重复提交同一表单
- · 用VB将ASP代码封装成DLL
- · 如何在IIS上搭建WAP网站
- · asp程序错误详细说明例表
- · 短信发送程序
- · 用ASP实现电子贺卡
- · ASP.NET创建并使用Web组件(1)
- · asp.net生成缩略图
- · 动态增加的DropDownList如何保持状态
- · ASP.NET创建并使用Web组件(2)
- · ASP.NET创建并使用Web组件(3)
- · 在ASP.NET中显示进度条
- · ASP.NET Whidbey中实现Provider(1)
- · ASP.NET Whidbey中实现Provider(2)
- · DataGrid控件使用技巧(1)
