在ASP.NET中使用用户控件

asp.net|控件

【摘要】ASP.NET中提供的用户控件,可以解决ASP中无法解决的代码重用问题,更方便了调试工作中的错误检查。本文通过用户控件实现方法讲解和一个用户控件例程的实现,进一步验证了利用用户控件解决代码重用的可行性和有效性。

  【关键字】代码重用、用户控件、@Register指令
  ASP.NET提供了比传统ASP更好的代码分离方案。在传统的ASP中,要将用Server. Execute执行的ASP文件或事务对象组件的代码分离开,一般只能将代码分离成几个文件,然后使用“include”的方法。这种方法将造成内存中有多个“include”文件的复本(文件每被引用一次就产生一个复本),从而增加了系统的负担,因此并不可行。使用Server. Execute或许有些改观,但是不能向正在执行的ASP文件传递附加的查询串参数。使用组件可能是唯一比较好的做法。在ASP.NET中,除了使用“include”(并不推荐使用)和事务对象组件的方法,还可以使用两种新技术:code-behind类和WEB用户控件。

  使用code-behind类可以有效地将客户端的HTML代码和服务器端的事件处理代码分离开。将这两部分代码分离开有利于调试时跟踪程序,因为那时就不必在实现用户界面的代码和事务逻辑代码之间来回切换。而且,如果项目中用户界面和事务处理是由不同的小组开发的,那么使用code-behind类就可以使这两部分实现独立调试。利用code-behind类将用户界面代码和事务逻辑代码区分开使得代码的集成和维护都比较简便。下面将介绍的用户控件,从代码重用的角度来处理代码分离问题。

  1、用户控件简介

  用户控件使程序员能够很容易地跨ASP.NET WEB应用程序划分和重复使用公共UI功能。与WEB窗体页相同,程序员可以使用任何文本编辑器创作用户控件,或者使用代码隐藏类开发用户控件。此外,与WEB窗体页一样,用户控件可以在第一次请求时被编译并存储在服务器内存中,从而缩短以后请求的响应时间。但与WEB窗体页不同的是,不能独立地请求用户控件,用户控件必须包括在WEB窗体页内才能使用。

  与服务器端包含文件(SSI)相比,用户控件通过访问由ASP.NET提供的对象模型支持,使程序员具有更大的灵活性。程序员可以对在控件中声明的任何属性进行编程,而不只是包含其他文件提供的功能,这与其他任何ASP.NET服务器控件一样。

  尽管在创作用户控件时需要选择一种语言,但程序员可以将多个用户控件包含在用多种语言创作的一个WEB窗体页中。例如,可以用Visual Basic.NET创造一个用户控件,导入来自XML文件的数据,再用C#创建另一个用户控件,该控件包含一个订单窗体,然后在同一个WEB窗体页中包括这两个控件。

  此外,可以独立于包含用户控件的WEB窗体页中除该控件以外的部分来缓存该控件的输出。这一技术称作片段缓存,适当地使用该技术能够提高站点的性能。例如,如果用户控件包含提出数据库请求的ASP.NET服务器控件,但该页的其余部分只包含文本和在服务器上运行的简单代码,则程序员可以对用户控件执行片段缓存,以改进应用程序的性能。

  2、创建用户控件

  可以通过使用文本或HTML编辑器以声明方式创建用户控件。用户控件声明语法与创建WEB窗体页所采用的语法十分类似;两者的主要差别在于用户控件在内容周围不包括<html>、<body>和<form>元素。在包含用户控件的WEB窗体页中包括这些元素。

  用户控件可以像文本文件一样简单,或者它们可以包含其他ASP.NET服务器控件。以下过程简要介绍了一个可包括在应用程序多个页上的简单登录窗体。

  在代码声明块中公开属性、事件处理程序以及要包括在用户控件功能中的其他任何代码。在使用用户控件的属性时有两个选择。首先,可以定义用户控件的新属性并操作它们。其次,可以操作构成用户控件的服务器控件的属性。例如,在用户控件中声明Textbox WEB服务器控件,并向它提供一个ID为PASSWORD,则可以通过使用PASSWORD. Text语法来操作其Text属性。

  【注意】当用户控件包括在WEB窗体页中时,此用户控件中包含的任何ASP.NET服务器控件的所有属性和方法都将提升为此用户控件的公共属性和方法。

  步骤1:以下代码示例声明映射到步骤1中代码的文本框的UserId和Password属性。可以通过声明或编程的方式,在任何包含此用户控件的WEB窗体页中操作这些属性。

Public MustInherit Class Loginform
Inherits System.Web.UI.UserControl
 Protected WithEvents User As System.Web.UI.WebControls.TextBox
 Protected WithEvents Pass As System.Web.UI.WebControls.TextBox
 Protected WithEvents Button1 As System.Web.UI.WebControls.Button
 #Region " Web 窗体设计器生成的代码 "

 '该调用是 Web 窗体设计器所必需的。
 <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
 'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
 '不要使用代码编辑器修改它。
 InitializeComponent()
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles MyBase.Load
 '在此处放置初始化页的用户代码
End Sub
Public Property UserId() As [String]
 Get
  Return User.Text
 End Get
 Set(ByVal Value As [String])
  User.Text = Value
 End Set
End Property
Public Property Password() As [String]
 Get
  Return Pass.Text
 End Get
 Set(ByVal Value As [String])
  Pass.Text = Value
 End Set
End Property
End Class
  步骤2:创建该用户控件显示的UI元素。以下代码创建与来自步骤1的代码进行交互的登录窗体。

  【注意】将此用户控件包括在Web窗体页中时,需要在@Register指令的Src属性中包括此文件名称以及该文件的路径。

<%@ Control Language="vb" AutoEventWireup="false" Codebehind="Logonform.ascx.vb" Inherits="logintest.Logonform" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<TABLE cellSpacing="15">
<TR>
<TD><B>用户姓名: </B></TD>
<TD><ASP:TextBox id="User" runat="server"></ASP:TextBox></TD>
</TR>
<TR>
<TD><B>用户口令: </B></TD>
<TD><ASP:TextBox id="Pass" runat="server" TextMode="Password"></ASP:TextBox></TD>
</TR>
<TR>
<TD></TD>
<TD><ASP:Button id="Button1" runat="server" Text="登录" BorderStyle="Groove"></ASP:Button></TD>
</TR>
</TABLE>

  3、调用用户控件

  只有当包括在WEB窗体页中时,用户控件才可以工作。当一个请求到达某一页而该页包含用户控件时,该用户控件将经历任何服务器控件所要经历的所有处理阶段。

  在 WEB 窗体页中包括用户控件的方法很简单。

  在要包含用户控件的 WEB 窗体页中,声明一个@Register指令,该指令包括:

  tagprefix属性,该属性将前缀与用户控件相关联。此前缀将包括在用户控件元素的开始标记中。

  tagname属性,该属性将名称与用户控件相关联。此名称将包括在用户控件元素的开始标记中。

  Src属性,该属性定义要包括在WEB窗体页中的用户控件文件的虚拟路径。

  例如,以下代码将注册在文件LoginForm.ascx中定义的用户控件。该控件还被指定有标记前缀Acme和标记名称Login。

<%@ Register TagPrefix="Acme" TagName="LoginForm" Src=".\LoginForm.ascx" %>

  使用自定义服务器控件语法在HtmlForm服务器控件的开始标记和结束标记之间 (<form runat=server></form>) 声明该用户控件元素。例如,要声明在上一步导入的控件,使用以下语法。

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="logintest.aspx.vb" Inherits="logintest.WebForm1"%>
<%@ Register TagPrefix="Acme" TagName="LoginForm" Src=".\LoginForm.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
 <title>WebForm1</title>
 <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.0">
 <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
 <meta name="vs_defaultClientScript" content="JavaScript">
 <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
 </HEAD>
<body MS_POSITIONING="GridLayout">
 <form id="Form1" method="post" runat="server">
  <Acme:LoginForm id=" LoginForm " runat="server"/>
 </form></BODY>
</HTML>
  【注意】无论在WEB窗体页上包括了多少个ASP.NET服务器控件(用户控件和其他任何控件),都应只在WEB窗体页上包括一个HtmlForm服务器控件。此控件的开始和结束标记之间应包括所有服务器控件。

  通过上面的程序,在logintest.aspx页中调用了名为loginform.ascx的用户控件,结果如下图所示:


  4、用户控件使用小结

  (1)用户控件使开发人员能够使用编写WEB窗体页的相同编程技巧轻松地定义自定义控件。 作为约定,用.ascx文件扩展名指示这样的控件。这样可以确保用户控件文件不能作为独立的WEB窗体页执行。

  (2)用户控件通过Register指令包括在另一WEB窗体页中,该指令指定TagPrefix、TagName和Src location。

  (3)注册了用户控件后,可以像普通的服务器控件那样将用户控件标记放置在WEB窗体页中(包括runat="server"属性)。在包含WEB窗体页中将用户控件的公共字段、属性和方法提升为该控件的公共属性(标记属性)和方法。

  (4)用户控件参与每个请求的整个执行生存期,并且可以处理自己的事件,封装来自包含WEB窗体页的一些页逻辑。

  (5)用户控件不应包含任何窗体控件,而应依靠其包含WEB窗体页在必要时包括窗体控件。

  (6)可以使用System.WEB.UI.Page类的LoadControl方法以编程方式创建用户控件。用户控件的类型由ASP.NET运行库决定,遵循约定文件名_扩展名。

  (7)只有当为用户控件包括了Register指令时,用户控件的强类型才能由包含WEB窗体页使用(即使没有实际声明的用户控件标记)。

  5、结束语

  在编写WEB应用程序时,如果将可能重复出现的元素都用用户控件来实现,那将大大减少维护代码的代价。而且在修改代码时,记得修改一段代码却忘了修改另一段同样代码的情况也将不存在了。代码越短,出现错误的因素越少,出现错误的可能性就越小。

时间: 2024-09-22 17:08:59

在ASP.NET中使用用户控件的相关文章

aspnet-请问ASP.NET中web用户控件中使用Session出错,麻烦帮忙解决下,拜托了

问题描述 请问ASP.NET中web用户控件中使用Session出错,麻烦帮忙解决下,拜托了 在用户控件中有下列代码: protected void Page_Load(object sender, EventArgs e) { if (Session["user"] != null) { login.Text = "欢迎你," + Session["user"].ToString().Trim(); login.NavigateUrl = Re

关于ASP.NET2.0 中的用户控件编程使用

asp.net|编程|控件 今天用了一下2.0中的用户控件,发现使用编程方式使用用户控件,跟1.X 中截然不同. 1.首先,要在所要使用的Page 头部声明引用.如下: <%@ Reference Control="../Controls/AlbumEditor.ascx" %> 2.在后置代码里,从"ASP"空间中就可以找到此控件的类引用了,不过还需要事例一下.-_-! 不明白设计者为什么要这么做,还不如1.1 那样直观.如下:  ASP.Contro

在.net应用程序中使用用户控件

程序|控件 在.net应用程序中使用用户控件 郑佐2004-11-30 做过asp.net的人都知道开发的时候使用用户控件很方便,为功能模块化提供了相当大的灵活性.令人高兴的是开发Windows窗体也可以使用用户控件.这里我们来看看为用户控件添加属性和事件,并实现把消息发送到父容器.本文主要是为没有使用过用户控件的朋友提供一些参考. 用户控件的实现比较简单,直接从System.Windows.Forms.UserControl. public class UserControl1 : Syste

Asp.Net中使用Highcharts控件X轴的categories数据一多会被截断

问题描述 Asp.Net中使用Highcharts控件X轴的categories数据一多会被截断 xAxis: { tickmarkPlacement: ""on"" type: 'datetime' tickInterval: [<%=num %>] categories: [<%=lastModifyTime %>] } xAxis中 categories数据会被截断的问题怎么解决 解决方案 ASP.NET中通过WebService获取数

在ASP.NET中使用AdRotator控件(转)

asp.net|控件 在ASP.NET中使用AdRotator控件 通过使用ASP.NET携带的AdRotator服务器控件,ASP.NET中的广告可以随时显示出来.本文中,我们将看到两个例子,它们使用这个控件在一个页面上显示广告. 使用AdRotator服务器控件有以下几个步骤: 第一步 创建一个包含着广告细节的XML文件,比如说叫art008_ads.xml,它包含以下元素: ●ImageUrl-包含将被显示图象的URL,可以是绝对路径,也可以是相对于显示广告的页面的相对路径.●Naviga

asp.net中显示DataGrid控件列序号的几种方法

asp.net|datagrid|datagrid控件|显示 asp.net中显示DataGrid控件列序号的几种方法 作者:郑佐 2004-9-10 在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值计算方式如下: (1)在后台 DataGrid.CurrentPageIndex * DataGrid.PageSize + e.Item.Item

asp .net中Ztree树控件,如何与导航栏联动,点击导航栏上的栏目,对应的树节点也要展开

问题描述 asp .net中Ztree树控件,如何与导航栏联动,点击导航栏上的栏目,对应的树节点也要展开 点击上面的栏目名称,对应的树节点也要展开 解决方案 导航和ztree什么关系..不就是调用getNodeByParam (key, value, parentNode)找到节点,然后expandNode展开节点而已.自己看api详细参数说明 解决方案二: 就是一个展开事件,在ztree官方例子有

asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序_实用技巧

数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,

asp.net中的TreeView控件节点文字怎么倾斜90度显示

问题描述 asp.net中的TreeView控件节点文字怎么倾斜90度显示? 解决方案 解决方案二:transform:rotate(angle)加这个CSS,自己设置个角度值就好了解决方案三:不行呀,你这个是treeview的旋转,我想要的是treeview中节点中文字的倾斜,树不动,中人是各节点中文字倾斜90度,文字如图