Asp.net 简明教程

ASP.NET - Custom Controls

ASP.NET 允许用户创建控件。这些自定义控件被归类为:

  1. User controls

  2. Custom controls

User Controls

用户控件的行为像微型的 ASP.NET 页面或 Web 窗体,可以用做许多其他页面。这些控件源自 System.Web.UI.UserControl 类。这些控件有以下特性:

  1. 它们拥有 .ascx 扩展名。

  2. 它们可能不包含任何 <html>、<body> 或 <form> 标签。

  3. 它们拥有 Control 指令,而不是 Page 指令。

为了理解概念,让我们创建一个简单的用户控件,它将作为网页页脚。要创建并使用用户控件,请执行以下步骤:

  1. 创建新的 Web 应用程序。

  2. 在解决方案资源管理器中右键单击项目文件夹,然后选择“添加新项”。

  3. 从“添加新项”对话框中选择 Web 用户控件,并将其命名为 footer.ascx。最初,footer.ascx 只包含一个控件指令。<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="footer.ascx.cs" Inherits="customcontroldemo.footer" %>

  4. 向文件添加以下代码:<table> <tr> <td align="center"> Copyright ©2010 TutorialPoints Ltd.</td> </tr> <tr> <td align="center"> Location: Hyderabad, A.P </td> </tr> </table>

若要将用户控件添加到网页中,你必须将 Register 指令以及用户控件实例添加到页面。以下代码显示了内容文件:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="customcontroldemo._Default" %>

<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Untitled Page
      </title>
   </head>

   <body>

      <form id="form1" runat="server">
         <div>

            <asp:Label ID="Label1" runat="server" Text="Welcome to ASP.Net Tutorials "></asp:Label>
            <br />  <br />
            <asp:Button ID="Button1" runat="server" onclick="Button1_Click"  Text="Copyright Info" />

         </div>
         <Tfooter:footer ID="footer1" runat="server" />
      </form>

   </body>
</html>

在执行后,页面会显示页脚,而且此控件可用于网站的所有页面中。

custom result

注意以下内容:

(1) Register 指令指定控件的标记名称以及标记前缀。

<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>

(2) 在页面上添加用户控件时,应当使用以下标记名称和前缀:

<Tfooter:footer ID="footer1" runat="server" />

Custom Controls

自定义控件作为独立程序集进行部署。它们被编译到动态链接库 (DLL) 中,并用作任何其他 ASP.NET 服务器控件。它们可以通过以下方式之一创建:

  1. 通过从现有控件派生自定义控件

  2. 通过组合两个或更多现有控件构成本自定义控件。

  3. 通过从基本控件类派生。

为了理解概念,让我们创建一个自定义控件,它将简单地在浏览器中呈现文本消息。要创建此控件,请执行以下步骤:

创建一个新网站。在解决方案资源管理器中右键单击树顶的解决方案(而不是项目)。

solution explorer

在“新建项目”对话框中,从项目模板中选择 ASP.NET 服务器控件。

project templates

上述步骤添加了一个新项目,并为解决方案创建了一个完整的自定义控件,名为 ServerControl1。在此示例中,让我们将项目命名为 CustomControls。为使用此控件,必须将其添加为对网站的引用,然后再在页面上注册它。若要向现有项目添加引用,请右键单击项目(而非解决方案),然后单击“添加引用”。

从“添加引用”对话框的“项目”选项卡中选择 CustomControls 项目。解决方案资源管理器应当显示引用。

custom controls

要在页面中使用控件,请在 @Page 指令下方添加 Register 指令:

<%@ Register Assembly="CustomControls"  Namespace="CustomControls"  TagPrefix="ccs" %>

此外,您可以使用控件,它与任何其他控件类似。

<form id="form1" runat="server">
   <div>
      <ccs:ServerControl1 runat="server" Text = "I am a Custom Server Control" />
   </div>
</form>

执行时,控件的 Text 属性将显示在浏览器中,如下所示:

custom server controls

Working with Custom Controls

在前一个示例中,设置了自定义控件的 Text 属性值。ASP.NET 在创建控件时默认添加了此属性。控件的后端代码显示这一点。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
   [DefaultProperty("Text")]
   [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1 >")]

   public class ServerControl1 : WebControl
   {
      [Bindable(true)]
      [Category("Appearance")]
      [DefaultValue("")]
      [Localizable(true)]

      public string Text
      {
         get
         {
            String s = (String)ViewState["Text"];
            return ((s == null) ? "[" + this.ID + "]" : s);
         }

         set
         {
            ViewState["Text"] = value;
         }
      }

      protected override void RenderContents(HtmlTextWriter output)
      {
         output.Write(Text);
      }
   }
}

上述代码会自动为自定义控件生成。可以向自定义控件类中添加事件和方法。

Example

让我们扩展名为 SeverControl1 的前一个自定义控件。让我们给它一个名为 checkpalindrome 的方法,它赋予它检查回文的权力。

回文是反转后拼写相同的单词/字面量。例如,Malayalam、madam、saras 等。

扩展自定义控件的代码,如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
   [DefaultProperty("Text")]
   [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1  >")]

   public class ServerControl1 : WebControl
   {
      [Bindable(true)]
      [Category("Appearance")]
      [DefaultValue("")]
      [Localizable(true)]

      public string Text
      {
         get
         {
            String s = (String)ViewState["Text"];
            return ((s == null) ? "[" + this.ID + "]" : s);
         }

         set
         {
            ViewState["Text"] = value;
         }
      }

      protected override void RenderContents(HtmlTextWriter output)
      {
         if (this.checkpanlindrome())
         {
            output.Write("This is a palindrome: <br />");
            output.Write("<FONT size=5 color=Blue>");
            output.Write("<B>");
            output.Write(Text);
            output.Write("</B>");
            output.Write("</FONT>");
         }
         else
         {
            output.Write("This is not a palindrome: <br />");
            output.Write("<FONT size=5 color=red>");
            output.Write("<B>");
            output.Write(Text);
            output.Write("</B>");
            output.Write("</FONT>");
         }
      }

      protected bool checkpanlindrome()
      {
         if (this.Text != null)
         {
            String str = this.Text;
            String strtoupper = Text.ToUpper();
            char[] rev = strtoupper.ToCharArray();
            Array.Reverse(rev);
            String strrev = new String(rev);

            if (strtoupper == strrev)
            {
               return true;
            }
            else
            {
               return false;
            }
         }
         else
         {
            return false;
         }
      }
   }
}

当您更改控件的代码时,必须点击 Build -→ Build Solution 构建解决方案,这样更改才会反映在项目中。向页面添加一个文本框和一个按钮控件,以便用户可以提供文本,在单击按钮时检查它是否是回文。

<form id="form1" runat="server">
   <div>
      Enter a word:
      <br />
      <asp:TextBox ID="TextBox1" runat="server" style="width:198px"> </asp:TextBox>

      <br /> <br />

      <asp:Button ID="Button1" runat="server onclick="Button1_Click" Text="Check Palindrome" style="width:132px" />

      <br /> <br />

      <ccs:ServerControl1 ID="ServerControl11" runat="server" Text = "" />
   </div>
</form>

按钮的 Click 事件处理程序只将文本框中的文本复制到自定义控件的文本属性。

protected void Button1_Click(object sender, EventArgs e)
{
   this.ServerControl11.Text = this.TextBox1.Text;
}

执行时,控件成功检查回文。

checks palindromes

注意以下内容:

(1) 当您向自定义控件添加引用时,它将添加到工具箱中,您可以直接从工具箱使用它,就像其他控件一样。

custom control reference

(2) 此处覆盖了自定义控件类的 RenderContents 方法,因为您可以添加自己的方法和事件。

(3) RenderContents 方法采用 HtmlTextWriter 类型的参数,负责在浏览器中呈现。