<%@ Register TagPrefix="Acme" TagName="Message" Src="pagelet1.ascx" %>

TagPrefix 确定用户控件的唯一命名空间(以便多个同名的用户控件可以相互区分)。TagName 是用户控件的唯一名称(可以选择任何名称)。Src 属性是用户控件的虚拟路径,例如“MyPagelet.ascx”或“/MyApp/Include/MyPagelet.ascx”。注册了用户控件后,可以像放置普通的服务器控件那样,将用户控件标记放置在 Web 窗体页中(包括 runat="server" 属性): 

<Acme:Message runat="server"/>


程序代码: [ 复制代码到剪贴板 ]

<%@ Page Language="C#" %>
<%@ Register TagPrefix="Acme" TagName="Message" Src="pagelet1.ascx" %>

<html>
<body style="font: 10pt verdana">

  <h3>A Simple User Control</h3>

  <Acme:Message runat="server"/>

</body>
</html>

.ascx
This is a simple message user control!




程序代码: [ 复制代码到剪贴板 ]
<%@ Register TagPrefix="Acme" TagName="Message" Src="pagelet2.ascx" %>

<html>

  <script language="C#" runat="server">

      void SubmitBtn_Click(Object sender, EventArgs E) {
          MyMessage.Text = "Message text changed!";
          MyMessage.Color = "red";
      }

  </script>

<body style="font: 10pt verdana">

  <h3>A Simple User Control w/ Properties</h3>

  <form runat="server">

    <Acme:Message id="MyMessage" Text="This is a custom message!" Color="blue" runat="server"/>

    <p>

    <asp:button text="Change Properties" OnClick="SubmitBtn_Click" runat=server/>

  </form>

</body>
</html>

.ascx

<script language="VB" runat="server">

  Public Color As String = "blue"
  Public MessageText As String = "This is a simple message user control!"

</script>

<span id="Message" style="color:<%=Color%>"><%=MessageText%></span>




程序代码: [ 复制代码到剪贴板 ]
<%@ Register TagPrefix="Acme" TagName="Address" Src="pagelet3.ascx" %>

<html>

    <script language="C#" runat="server">

        void SubmitBtn_Click(Object sender, EventArgs E) {
        
            MyLabel.Text += "<b>Shipping Address:</b> "
                         +   ShipAddr.Address + ", " 
                         +   ShipAddr.City + ", " 
                         +   ShipAddr.State + ", " 
                         +   ShipAddr.Zip + "<br>";

            MyLabel.Text += "<b>Billing Address:</b> "
                         +   BillAddr.Address + ", " 
                         +   BillAddr.City + ", " 
                         +   BillAddr.State + ", " 
                         +   BillAddr.Zip + "<br>";
        }

    </script>

<body style="font: 10pt verdana">

  <h3>A Simple User Control w/ Properties</h3>

  <form runat="server">

    <Acme:Address id="ShipAddr" Caption="Shipping Address" Address="One Microsoft Way" City="Redmond" State="WA" Zip="98052" runat="server"/>

    <p>

    <Acme:Address id="BillAddr" Caption="Billing Address" runat="server"/>

    <p>

    <asp:button Text="Submit Form" OnClick="SubmitBtn_Click" runat=server/>

  </form>

  <asp:Label id="MyLabel" runat="server"/>

</body>
</html>

.ascx

<script language="C#" runat="server">

  public String Caption = "Address";

  public String Address {
    get {
      return TxtAddress.Value;
    }
    set {
      TxtAddress.Value = value;
    }
  }

  public String City {
    get {
      return TxtCity.Value;
    }
    set {
      TxtCity.Value = value;
    }
  }

  public String State {
    get {
      return TxtState.Value;
    }
    set {
      TxtState.Value = value;
    }
  }

  public String Zip {
    get {
      return TxtZip.Value;
    }
    set {
      TxtZip.Value = value;
    }
  }

</script>

<p>
<table style="font: 10pt verdana">
  <tr>
    <td colspan="6" style="padding-bottom:10">
      <b><%=Caption%></b>
    </td>
  </tr>
  <tr>
    <td>
      Address: 
    </td>
    <td colspan="5">
      <input id="TxtAddress" size="50" type="text" runat="server">
    </td>
  </tr>
  <tr>
    <td>
      City: 
    </td>
    <td>
      <input id="TxtCity" type="text" runat="server">
    </td>
    <td>
      State: 
    </td>
    <td>
      <input id="TxtState" size="2" type="text" runat="server">
    </td>
    <td>
      Zip: 
    </td>
    <td>
      <input id="TxtZip" size="5" type="text" runat="server">
    </td>
  </tr>
</table>




程序代码: [ 复制代码到剪贴板 ]
<%@ Register TagPrefix="Acme" TagName="Login" Src="pagelet4.ascx" %>

<html>

<script language="C#" runat="server">

  void Page_Load(Object sender, EventArgs E) {

    if (Page.IsPostBack) {
      MyLabel.Text += "The UserId is " + MyLogin.UserId + "<br>";
      MyLabel.Text += "The Password is " + MyLogin.Password + "<br>";
    }    
  }

</script>

<body style="font: 10pt verdana">

  <h3>A Login User Control</h3>

  <form runat="server">

    <Acme:Login id="MyLogin" UserId="John Doe" Password="Secret" BackColor="beige" runat="server"/>

  </form>

  <asp:Label id="MyLabel" runat="server"/>

</body>
</html>

.ascx

<script language="C#" runat="server">

  public String BackColor = "white";

  public String UserId {
    get {
      return User.Text;
    }
    set {
      User.Text = value;
    }
  }

  public String Password {
    get {
      return Pass.Text;
    }
    set {
      Pass.Text = value;
    }
  }

</script>

<table style="background-color:<%=BackColor%>;font: 10pt verdana;border-width:1;border-style:solid;border-color:black;" cellspacing=15>
  <tr>
    <td><b>Login: </b></td>
    <td><ASP:TextBox id="User" runat="server"/></td>
  </tr>
  <tr>
    <td><b>Password: </b></td>
    <td><ASP:TextBox id="Pass" TextMode="Password" runat="server"/></td>
  </tr>
  <tr>
    <td></td>
    <td><ASP:Button Text="Submit" runat="server"/></td>
  </tr>
</table>




程序代码: [ 复制代码到剪贴板 ]
<%@ Register TagPrefix="Acme" TagName="Login" Src="pagelet5.ascx" %>

<html>

<script language="C#" runat="server">

  public void Page_Load(Object sender, EventArgs E) {

    if (Page.IsPostBack) {
        Page.Validate();
        if (Page.IsValid) {
            MyLabel.Text += "The UserId is " + MyLogin.UserId + "<br>";
            MyLabel.Text += "The Password is " + MyLogin.Password + "<br>";
        }
    }
  }

</script>

<body style="font: 10pt verdana">

  <h3>A Login User Control</h3>

  <form runat="server">

    <Acme:Login id="MyLogin" BackColor="beige" runat="server"/>

  </form>

  <asp:Label id="MyLabel" runat="server"/>

</body>
</html>

.ascx

<script language="C#" runat="server">

  public String BackColor = "white";

  public String UserId {
    get {
      return User.Text;
    }
    set {
      User.Text = value;
    }
  }

  public String Password {
    get {
      return Pass.Text;
    }
    set {
      Pass.Text = value;
    }
  }

  public bool IsValid {
    get {
      return Page.IsValid;
    }
  }

</script>

<table style="background-color:<%=BackColor%>;font: 10pt verdana;border-width:1;border-style:solid;border-color:black;" cellspacing=15>
  <tr>
    <td><b>Login: </b></td>
    <td><ASP:TextBox id="User" runat="server"/></td>
  </tr>
  <tr>
    <td><b>Password: </b></td>
    <td><ASP:TextBox id="Pass" TextMode="Password" runat="server"/></td>
  </tr>
  <tr>
    <td></td>
    <td><ASP:Button Text="Submit" OnServerClick="Submit_Click" runat="server"/></td>
  </tr>
  <tr>
    <td align="center" valign="top" colspan="2">
    
      <asp:RegularExpressionValidator id="Validator1"
          ASPClass="RegularExpressionValidator" ControlToValidate="Pass"
          ValidationExpression="[0-9a-zA-Z]{5,}"
          Display="Dynamic"
          Font-Size="8pt"
          runat=server>
          Password must be >= 5 alphanum chars<br>
      </asp:RegularExpressionValidator>
      
      <asp:RequiredFieldValidator id="Validator2"
          ControlToValidate="User"
          Font-Size="8pt"
          Display="Dynamic"
          runat=server>
          UserId cannot be blank<br>
      </asp:RequiredFieldValidator>
      
      <asp:RequiredFieldValidator id="Validator3"
          ControlToValidate="Pass"
          Font-Size="8pt"
          Display="Dynamic"
          runat=server>
          Password cannot be blank<br>
      </asp:RequiredFieldValidator>
      
    </td>
  </tr>
</table>




程序代码: [ 复制代码到剪贴板 ]
<%@ Page Language="C#" %>
<%@ Register TagPrefix="Acme" TagName="BookList" Src="pagelet6.ascx" %>

<html>
<body style="font: 10pt verdana">

  <h3>A User Control w/ an Event</h3>

  <form runat="server">

    <Acme:BookList runat="server"/>

  </form>

</body>
</html>

.ascx

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<script language="C#" runat="server">

    void Page_Load(Object Src, EventArgs e) {

        if (!Page.IsPostBack) {

          SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Integrated Security=SSPI");
          SqlDataAdapter myCommand = new SqlDataAdapter("select * from Titles where type='" + Category.SelectedItem.Value + "'", myConnection);

          DataSet ds = new DataSet();
          myCommand.Fill(ds, "Titles");

          MyDataList.DataSource = ds.Tables["Titles"].DefaultView;
          MyDataList.DataBind();
       }
    }

    void Category_Select(Object sender, EventArgs e) {

      SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Integrated Security=SSPI");
      SqlDataAdapter myCommand = new SqlDataAdapter("select * from Titles where type='" + Category.SelectedItem.Value + "'", myConnection);

      DataSet ds = new DataSet();
      myCommand.Fill(ds, "Titles");

      MyDataList.DataSource = ds.Tables["Titles"].DefaultView;
      MyDataList.DataBind();
    }

</script>

<table style="font: 10pt verdana">
  <tr>
    <td><b>Select a Category:</b></td>
    <td style="padding-left:15">
      <ASP:DropDownList AutoPostBack="true" id="Category" OnSelectedIndexChanged="Category_Select" runat="server">
        <ASP:ListItem value="business">Business</ASP:ListItem>
        <ASP:ListItem value="trad_cook">Traditional Cooking</ASP:ListItem>
        <ASP:ListItem value="mod_cook">Modern Cooking</ASP:ListItem>
      </ASP:DropDownList>
    </td>
  </tr>
</table>

<ASP:DataList id="MyDataList" BorderWidth="0" RepeatColumns="2" runat="server">

    <ItemTemplate>

      <table cellpadding=10 style="font: 10pt verdana">
        <tr>
          <td valign="top">
            <img align="top" src='<%# DataBinder.Eval(Container.DataItem, "title_id", "/quickstart/aspplus/images/title-{0}.gif") %>' >
          </td>
          <td valign="top">
            <b>Title: </b><%# DataBinder.Eval(Container.DataItem, "title") %><br>
            <b>Category: </b><%# DataBinder.Eval(Container.DataItem, "type") %><br>
            <b>Publisher ID: </b><%# DataBinder.Eval(Container.DataItem, "pub_id") %><br>
            <b>Price: </b><%# DataBinder.Eval(Container.DataItem, "price", "$ {0}") %>
          </td>
        </tr>
      </table>

    </ItemTemplate>

</ASP:DataList>





程序代码: [ 复制代码到剪贴板 ]
<%@ Register TagPrefix="Acme" TagName="BookList" Src="pagelet7.ascx" %>

<html>

    <script language="C#" runat="server">

        void Page_Load(Object sender, EventArgs E) {

            Page.Controls.Add(new HtmlGenericControl("hr"));

            Control c1 = LoadControl("pagelet7.ascx");
            ((Pagelet7CS)c1).Category = "business";
            Page.Controls.Add(c1);

            Page.Controls.Add(new HtmlGenericControl("hr"));

            Control c2 = LoadControl("pagelet7.ascx");
            ((Pagelet7CS)c2).Category = "trad_cook";
            Page.Controls.Add(c2);

            Page.Controls.Add(new HtmlGenericControl("hr"));

            Control c3 = LoadControl("pagelet7.ascx");
            ((Pagelet7CS)c3).Category = "mod_cook";
            Page.Controls.Add(c3);
        }

    </script>

<body style="font: 10pt verdana">

  <h3>Creating User Controls Programmatically</h3>

</body>
</html>

.ascx

<%@ Control ClassName="Pagelet7CS" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<script language="C#" runat="server">

    private String _category = "";

    public String Category {

      get {
        return _category;
      }
      set {
          _category = value;
          SqlConnection myConnection = new SqlConnection("server=(local)\\NetSDK;database=pubs;Integrated Security=SSPI");
          SqlDataAdapter myCommand = new SqlDataAdapter("select * from Titles where type='" + _category + "'", myConnection);

          DataSet ds = new DataSet();
          myCommand.Fill(ds, "Titles");

          MyDataList.DataSource = ds.Tables["Titles"].DefaultView;
          MyDataList.DataBind();
      }
    }

</script>

<span style="font: 12pt verdana">Category: <%=Category%></span>

<ASP:DataList id="MyDataList" BorderWidth="0" RepeatColumns="2" runat="server">

    <ItemTemplate>

      <table cellpadding=10 style="font: 10pt verdana">
        <tr>
          <td valign="top">
            <img align="top" src='<%# DataBinder.Eval(Container.DataItem, "title_id", "/quickstart/aspplus/images/title-{0}.gif") %>' >
          </td>
          <td valign="top">
            <b>Title: </b><%# DataBinder.Eval(Container.DataItem, "title") %><br>
            <b>Category: </b><%# DataBinder.Eval(Container.DataItem, "type") %><br>
            <b>Publisher ID: </b><%# DataBinder.Eval(Container.DataItem, "pub_id") %><br>
            <b>Price: </b><%# DataBinder.Eval(Container.DataItem, "price", "$ {0}") %>
          </td>
        </tr>
      </table>

    </ItemTemplate>

</ASP:DataList>




用户控件使开发人员能够使用编写 Web 窗体页的相同编程技巧轻松地定义自定义控件。 
作为约定,用 .ascx 文件扩展名指示这样的控件。这样可以确保用户控件文件不能作为独立的 Web 窗体页执行。 
用户控件通过 Register 指令包括在另一 Web 窗体页中,该指令指定 TagPrefix、TagName 和 Src location。 
注册了用户控件后,可以像普通的服务器控件那样将用户控件标记放置在 Web 窗体页中(包括 runat="server" 属性)。 
在包含 Web 窗体页中将用户控件的公共字段、属性和方法提升为该控件的公共属性(标记属性)和方法。 
用户控件参与每个请求的整个执行生存期,并且可以处理自己的事件,封装来自包含 Web 窗体页的一些页逻辑。 
用户控件不应包含任何窗体控件,而应依靠其包含 Web 窗体页在必要时包括窗体控件。 
可以使用 System.Web.UI.Page 类的 LoadControl 方法以编程方式创建用户控件。用户控件的类型由 ASP.NET 运行库决定,遵循约定文件名_扩展名。 
只有当为用户控件包括了 Register 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。