当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  自定义控件研究(续) 2

 自定义控件研究(续) 2

点击次数:34 次 发布日期:2008-11-26 11:45:50 作者:源代码网
源代码网推荐      图 2. Visual Studio 2005 中的新建项目向导
源代码网推荐  
源代码网推荐    该项目是利用默认的自定义控件类实现创建的。对于我们的示例,我们将该默认文件重命名为 MailLink.cs。
源代码网推荐  
源代码网推荐    注:在解决方案资源管理器中重命名该文件时,Visual Studio 2005 将会自动更新类名。
源代码网推荐  
源代码网推荐    MailLink 的源代码在由项目向导生成的默认模板上构建。MailLink 类从 WebControl 基类自动派生。
源代码网推荐  
源代码网推荐  public class MailLink : WebControl {
源代码网推荐  
源代码网推荐    WebControl 类提供默认实现方法,可以很简单地覆盖这些方法来为我们的控件提供详细说明。
源代码网推荐  
源代码网推荐    添加属性
源代码网推荐  
源代码网推荐    在 MailLink 示例中,我们需要添加 Email 和 Text 属性。为了正确配置这些属性,我们不仅必须编写代码,还要分配几个特性。
源代码网推荐  
源代码网推荐  [Bindable(true),
源代码网推荐  Category("Appearance"),
源代码网推荐  DefaultValue(""),
源代码网推荐  Description("The e-mail address.")]
源代码网推荐  
源代码网推荐  public virtual string Email {
源代码网推荐  get {
源代码网推荐  string s = (string)ViewState["Email"];
源代码网推荐  return (s == null) ? String.Empty : s;
源代码网推荐  }
源代码网推荐  set {
源代码网推荐  ViewState["Email"] = value;
源代码网推荐  }
源代码网推荐  }
源代码网推荐  
源代码网推荐    特性(以粗体表示)定义了新控件将如何与设计器 (Visual Studio) 进行交互。Email 属性的特性告诉 Visual Studio 如何在设计过程中处理属性:
源代码网推荐  
源代码网推荐    1) Bindable — Email 属性可绑定 到数据源。您可以将 Email 字段链接到数据库、XML 文件或任何其他 DataSet。该特性强制 Visual Studio 在控件的可绑定属性列表中显示 Email 属性。
源代码网推荐  
源代码网推荐    2) Appearance —Email 属性将显示在 Appearance 类别下的属性视图中。您可以选择想要的任何类别,包括默认类别:Appearance、Accessibility、Behavior、Data、Layout 或 Misc。只要用户选择了属性的类别组织方法,Email 属性将会显示在 Appearance 下。
源代码网推荐  
源代码网推荐    3) DefaultValue — Email 属性具有一个空的默认值。尽管空值对于 Email 字段来说有意义,但对于您添加到控件中的其他属性可能并不合适。当用户将您的控件放到他们的 Web 页上时,选择适当的默认值可为用户免去不计其数的单击操作。
源代码网推荐  
源代码网推荐    4) Description — 属性说明显示在控件列表下,并且也可能作为工具提示出现。Email 属性将具有 The e-mail address 说明。
源代码网推荐  
源代码网推荐    5) Localizable — 它会用发送信号的方式通知 ASP.NET 2.0 Framework 该控件包括可以针对不同语言或位置进行配置的文本属性。
源代码网推荐  
源代码网推荐    您可以使用 System.ComponentModel 命名空间中的各种特性来进一步改进任何特殊属性的外观和行为。我们将在本文的使用设计器部分中更详细地介绍修改属性或控件的行为的方法。
源代码网推荐  
源代码网推荐    接下来,我们需要添加 Text 属性。Text 属性与 Email 属性稍有不同,因为我们希望将 Text 显示为由 MailLink 控件发出的 HTML 的一部分。为此,我们需要从 System.Web.UI 命名空间中添加一个新的特性。
源代码网推荐  
源代码网推荐  [Bindable(true),
源代码网推荐  Category("Appearance"),
源代码网推荐  DefaultValue(""),
源代码网推荐  Description("The text to display on the link."),
源代码网推荐  Localizable(true),
源代码网推荐  PersistenceMode(PersistenceMode.InnerDefaultProperty)]
源代码网推荐  public virtual string Text {
源代码网推荐  get {
源代码网推荐  string s = (string)ViewState["Text"];
源代码网推荐  return (s == null) ? String.Empty : s;
源代码网推荐  }
源代码网推荐  Set {
源代码网推荐  ViewState["Text"] = value;
源代码网推荐  }
源代码网推荐  }
源代码网推荐  
源代码网推荐    Text 属性的 PersistenceMode(PersistenceMode.InnerDefaultProperty) 特性(粗体代码)指定设计器应该将该属性作为控件标记内的内部内容序列化。该特性还声明 Text 是控件的默认属性。当用户在 Visual Studio 中使用这个控件时,Text 属性将会作为该控件的内部文本自动显示在图形设计器上,并且如果用户单击该控件并尝试更改显示的文本,Text 属性将会自动更改。
源代码网推荐  
源代码网推荐    另一方面,应用到属性的特性会影响设计期间用户与控件的交互方式。在运行过程中,这些特性被 ASP.NET 运行时忽略。
源代码网推荐  
源代码网推荐  有关 ViewState 的注释
源代码网推荐  
源代码网推荐    请注意,用于两个属性的 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 项目编译到一个程序集中。
源代码网推荐  
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华