11.1 用户控件

  在ASP编程中,开发人员经常使用Include方式包含其他文件从而简化编程过程。而在ASP.NET中,控件能够提高应用程序中代码的复用性,不仅ASP.NET提供了服务器控件,ASP.NET还支持用户自定义控件,从而提高了代码的复用性。

11.1.1 什么是用户控件
  用户控件使开发人员能够根据应用程序的需求,方便的定义和编写控件。开发所使用的编程技术将与编写Web窗体的技术相同,只要开发人员对控件进行修改,就可以将使用该控件的页面的所有控件都进行更改。为了确保用户控件不会被修改、下载,被当成一个独立的Web窗体来运行,用户控件的后缀名为.ascx,当用户访问页面时,用户控件是不能被用户直接访问的。
注意:虽然.ascx文件会阻止用户的直接访问,但是一些常用的下载工具还是能够下载.ascx文件。

11.1.2 编写一个简单的控件
  用户控件是以.ascx为后缀名的,在Visual Studio 2008中,可以通过【添加新项】选项创建一个用户控件,如图11-1所示。
创建用户控件
图11-1 创建用户控件
  用户控件创建完毕后,会生成一个.ascx页面。.ascx页面结构同.aspx页面基本没有什么区别。在解决方案管理器中可以打开.aspx页面和.ascx页面进行对比,其结构并没有太大的变化,如图11-2和图11-3所示。
创建一个用户控件
图11-2 创建一个用户控件
用户控件的结构
图11-3 用户控件的结构
  用户控件中并没有“<html><body>”等标记,因为.ascx页面作为控件被引用到其他页面,引用的页面(如.aspx页面)其中已经包含<body><html>等标记。而如果控件中使用这样的标记,可能会造成页面布局混乱。用户控件创建完成后,.ascx页面代码如下所示。
+展开
-HTML
<%@ Control Language="C#" AutoEventWireup="true"
 CodeBehind="mycontrol.ascx.cs" Inherits="_11_1.mycontrol" %>

  其中没有任何的“<body><html>”等标记,而.ascx.cs页面代码基本同.aspx相同,示例代码如下所示。
+展开
-C#
using System;//使用系统命名空间
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;//使用Web命名空间
using System.Web.Security;
using System.Web.UI;//使用UI命名控件
using System.Web.UI.HtmlControls;//使用Html控件命名空间
using System.Web.UI.WebControls;//使用Web控件命名空间
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq; //使用LINQ命名空间
namespace _11_1
{
    public partial class mycontrol : System.Web.UI.UserControl//从控件类派生
    {
        protected void Page_Load(object sender, EventArgs e)//页面加载方法
        {
        }
    }
}

  用户控件能够提高复用性,前面介绍的服务器控件,从很多情况下来说都可以看作是用户控件的一种。当网站需要登录框时,不可能在每个需要登录的地方都重新编写一个登录框,最好的方法是每个页面都能够引用一个登录框。当需要对登录框进行修改时,可以一次性的将所有的页面都修改完毕,而不需要对每个页面都修改登录框。
  要达到这种目的,使用用户控件是最好不错的了。.ascx页面允许开发人员拖动服务器控件,并编写相应的样式来实现用户控件,同时用户控件也能够支持事件、方法、委托等高级编程。编写一个用户登录窗口,可以通过几个TextBox控件和Button控件来实现,示例代码如下所示。
+展开
-HTML
<%@ Control Language="C#" 
AutoEventWireup="true" CodeBehind="mycontrol.ascx.cs" Inherits="_11_1.mycontrol" %>

<div style="border:1px solid #ccc; width:300px; background:#f0f0f0; padding:5px 5px 5px 5px; font-size:12px;">
    用户登录<br ><br >
    用户名 : <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br ><br >
    密码: <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br ><br >
    <asp:Button ID="Button1" runat="server" Text="登录" />
    <asp:HyperLink ID="HyperLink1" runat="server">还没有注册?</asp:HyperLink>
</div>

  上述代码创建了一个登录框界面。当用户进行网站访问时,网站希望用户能够注册和登录到网站从而提高网站的用户粘度、提升访问量。所以设置登录窗口是非常必要的,界面布局如图11-4所示。
编写用户登录界面
图11-4 编写用户登录界面
  当界面布局完毕后,就需要为用户控件编写事件。当用户单击【登录】按钮时,就需要进行事件操作。同Web窗体一样,双击按钮同样会自动生成事件,示例代码如下所示。
+展开
-C#
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Text = "登录成功";//显示登录信息
        }

  当单击【登录】按钮时,系统提示登录成功,当然这里只是一个简单的用户控件。如果要实现复杂的用户控件的登录窗口,还需要对用户登录进行验证、查询和判断等功能。当用户控件制作完毕后,就可以在其他页面引用用户控件,示例代码如下所示。
+展开
-HTML
<%@ Register TagPrefix="Sample" TagName="Login" Src="~/mycontrol.ascx" %><!--声明控件引用-->

在这段代码中,有几个属性是必须编写的,这些属性的功能如下所示:
1)TagPrefix:定义控件位置的命名控件。有了命名空间的制约,就可以在同一个页面中使用不同功能的同名控件。
2)TagName:指向所用的控件的名字。
3)Src:用户控件的文件路径,可以为相对路径或绝对路径,但不能使用物理路径。
  了解了相关属性,就能够在其他页面中引用该控件了,示例代码如下所示。
+展开
-HTML
<%@ Page Language="C#" 
AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_11_1._Default" %>

<%@ Register TagPrefix="Sample" TagName="Login" Src="~/mycontrol.ascx" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>用户控件</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <Sample:Login runat="server" id="Login1"></Sample:Login> 
    </div>
    </form>
</body>
</html>

 上述代码声明了用户控件,并使用了用户控件,使用用户控件代码如下所示。
+展开
-HTML
    <Sample:Login runat="server" id="Login1"></Sample:Login><!--使用用户控件-->

  从上述代码可以看出,用户控件的格式为TagPrefix:TagName,当声明了用户控件后,就可以使用TagPrefix:TagName的方式使用用户控件。这样一个用户控件就使用完毕了,如图11-5所示。
使用用户控件
图11-5 使用用户控件
  运行Default.aspx页面,虽然在Default.aspx页面中没有使用制作和编写任何控件,以及代码,但是却已经运行了登录框,这说明用户控件已经被运行了,如图11-6所示。
运行用户控件
图11-6 运行用户控件
  当需要对登录框进行修改,而无需对页面进行修改时,只需要修改相应的用户控件即可。当多个页面进行同样的用户控件的使用时,若需要对多个页面的控件进行样式或逻辑的更改只需要修改相应的控件,而不需要进行繁冗的多个页面的修正。

11.1.3 将Web窗体转换成用户控件
  在编写用户控件时,会发现Web窗体的结构和用户控件的结构基本相同。如果开发人员已经开发了Web窗体,并在今后的需求中决定能够在应用程序全局中能够访问此Web窗体,那么就可以将Web窗体改成用户控件。如果需要将Web窗体更改为用户控件,首先需要对比Web窗体和用户控件的区别:
1)Web窗体中有<body><html><head>等标记,而用户控件没有。
2)Web窗体和用户控件所声明的方法不同。
  在了解以上区别后,就可以很容易的将Web窗体转换成用户控件。首先,只需要删除<body><html><head>等标记即可。在删除标记后,好需要对两种窗体的声明方式进行更改,对于Web窗体,其标记方式如下代码所示。
+展开
-HTML
<%@ Page Language="C#" 
AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_11_1._Default" %>

 而对于用户控件,声明代码如下所示。
+展开
-HTML
<%@ Control Language="C#" 
AutoEventWireup="true" CodeBehind="mycontrol.ascx.cs" Inherits="_11_1.mycontrol" %>

  在将Web窗体更改为用户控件时,只需要将Page Language更改为Control Language即可。这样就完成了Web窗体向用户控件的转换过程。
注意:有的时候,标记中还包括ClassName属性,当包含ClassName属性时,还需要修改相应的ClassName属性。

加支付宝好友偷能量挖...


评论(0)网络
阅读(99)喜欢(0)Asp.Net/C#/WCF