ASP.NET用户控件技术

我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一些局限性。在本文中,我们将会一同探讨另外一种新的ASP.NET技术:用户控件。 
   
  什么是用户控件(User Controls)? 
  为了能更好的理解用户控件的重要性,我们先来看看一段小小的“历史”。在以前的ASP当中,可重用的技术实现选择是相当受限制的。许多的开发者一般都是借助将公共的常用的子过程放到那些包含文件当中的做法来实现一定的所谓代码重用的。比如,如我们想要在许多的ASP页面当中现实一个下拉列表框,我会在一个包含文件当中建立一个函数,样子如下所示: 
   
  Function GetListBox(asSelectedItem) 
  '为HTML的选择控件建立字符串 
  '返回这个字符串 
  End Function 
   
  当然,这样的做法的确在一定程度上做到了重用,但是为了能做到更加通用性,你不得不要增加更多的参数。为了使得类似上面的你需要整理的代码得以正常工作是困难的,因为要达到提供它的通用性(可重用性),你大概不得不去修改这些已经存在的代码,以便使得他们也能在新的环境下正常工作。 
  IIS5中的VBScript5.0增加了建立类的功能。这就使得我们可以通过一个较多面向对象的方式来实现可重用的代码。 
   
  Class ComboBox 
  Property Let ControlName(vData) 
  . 
  End Property 
   
  End Class 
   
  这样做会稍微好一些,但是开发者仍旧需要被迫去编写那些函数,以便返回HTML代码。而且,他也没有能力操纵那些类的实例对象的事件。为了能做到操作事件,开发者不得不建立一些COM组件,而后者则增加了应用程序的额外的复杂度。 
   
  有了ASP.NET,我们拥有了一个新的简单的工具来编写可重用的代码—用户控件。用户控件(也叫pagelets)提供了这样一种机制,他使得我们可以建立能够非常容易的被ASP.NET页面使用或者重新利用的代码部件。一个用户控件也是一个简单的ASP.NET页面,不过它可以被另外一个ASP.NET页面包含进去。在你的ASP.NET应用程序当中使用用户控件的一个主要的优点是用户控件的支持一个完全面向对象的模式,使得你有能力去捕获事件。而且,用户控件支持你使用一种语言编写ASP.NET页面其中的一部分代码,而使用另外的一种语言编写ASP.NET页面另外一部分代码,因为每一个用户控件可以使用和主页面不同的语言来编写。 
   
   
  建立一个用户控件 
  在建立你自己的用户控件之前,你也许想知道在你的web页面中哪些可见的对象是能够重用的好的候选者。能可能的是,你将会在你的站点上的不止一个页面上需要使用融合的用户控件。一旦你开始不断的思考你的控件的结构,你就已经做好的开始的准备。在我们的例子当中,我们将要建立一个简单的搜索的控件,用来搜索SQL Server2000中的数据库Northwind。我们的搜索控件可以使得开发者快速的为一个web页面增加搜索能力。 
   
  建立用户控件的第一步是建立一个.ascx文件。这是用户控件需要的文件扩展名。在一个一个.ascx文件中不能包含head,form,或者body标签,因为包含此.ascx文件的.aspx文件已经包含了这些标签。一个.ascx文件只能包含方法,函数,以及和用户控件相关的内同。 
   
  在建立一个.ascx文件之后,我们想要为用户控件增加一些可视的代码。在一个用户控件当中可以包含所有的web控件。在我们的例子当中,搜索控件需要拥有一个标签,一个文本框以及一个按钮。我们首先加入这些web控件,因为我们的整个代码当中会涉及到这些对象。下面是具体的代码: 
   
     
     
   
   
  在用户控件中有一件很酷的事情是,你可以定义你自己的属性。在我们的例子当中,我们会定义如下属性: 
   
  。LabelText—描述显示给用户的搜索条件 
  。ConnectiongString---用来联接到数据库的连接字符串 
  。ResultSetView—包含了搜索结果的数据记录集 
  。TableName—要搜索的数据库table名称 
  。Condition—需要搜索的table的列的名称 
   
  为了建立这些属性,我们使用一些联合起来的get和set方法来同属性结合起来。在做这些工作之前,我们需要首先决定一个属性是否需要允许读,写,还是两者都需要。对于只需要读的属性,我们将会使用ReadOnly关键字来限定属性的声明,并且仅仅包含了get方法。我们的ResultSetView属性是一个只读的属性,因此它的相关代码看起来如下: 
  '这是一个只读的属性 
   
  Public ReadOnly Property ResultSetView as dataView 
  Get 
  '设置返回属性地值 
  ResultSetView = dsData.tables("BookTitles").defaultview 
  End Get 
  End Property 
   
  对于只需要写的属性,我们将会使用WriteOnly关键字来限定属性的声明,并且仅仅包含了set方法。我们的TableName属性是一个只写属性,因此它的相关代码看起来如下: 
   
  'This write only attribute identifies which table will be searched 
  Public WriteOnly Property TableName as string 
  Set 
  '设置表的名称 
  strTableName = Value 
  End Set 
  End Property 
   
  对于那些既能读也能写的属性,在定义的时候就不需要加以限定了;并且同时包含了Get和Set方法。一旦这个属性被建立,.aspx文件就可以读取或者设置这些属性,使得用户控件可以适应一个或者多个用途了。 
   
  在用户控件当中,和定义不同的属性相结合,你也需要定义任意的方法,这些方法可以被用户控件初始化。这些属性和方法定义了用户控件的功能。在我们的例子当中使用的是search方法。这个方法读取各个用户定义在.aspx文件中的控件属性,并且返回一个搜索的结果记录集。所有的操纵数据库的代码都在这个方法中了:建立SQL语句,打开数据库联接,并且从数据库中返回一个结果。 
   
  '这个程序依照属性的值来操纵一个数据库 
  Public Sub Search(sender As Object , e As System.EventArgs) 
  Dim cnConnection As SQLConnection 
  Dim cmdCommand As SQLDataSetCommand 
  Dim strSearchString As String 
  Dim strSQL As String 
  '如果用户在搜索框中输入了条件 
  If txtSearch.Text <> "" Then 
  '过滤掉字符的前后空格 
  strSearchString = trim$(txtSearch.Text) 
  End If 
  '建立我们的SQL语句 
  strSQL = "Select * " & _ 
  "FROM " & strTableName & _ 
  " Where " & strConditionField & " LIKE '" & _ 
  trSearchString & "%'" 
  '如果联接属性被设置了 
  If strConnection <> "" Then 
  '建立数据库联接 
  cnConnection = New SQLConnection(strConnection) 
  '打开数据库联接 
  cnConnection.open() 
  '为搜索建立一个新的command对象 
  cmdCommand = New SQLDataSetCommand(strSQL, cnConnection) 
  '建立一个新的DataSet对象 
  dsData = New DataSet() 
  '填充dataset对象 
  cmdCommand.FillDataSet(dsData, "BookTitles") 
  End If 
  End Sub 
   
  一旦你在你的用户控件当中添加了属性和方法,控件的开发也就大致完成了。 
  现在我们对一个用户控件是如何建立的有了一个认识,让我们来看看用户控件是如何工作的。下面是我们的用户控件被包含在一个form当中的时候看起来的样子:   
   
  我们的用户控件将会放在一个国际食物网站的一个搜索页面上。为了建立这个搜索页面,我们先建立一个空的.aspx文件。我们先安排好所有的图片和布局,之后加入我们的用户控件。 
  为了能够在一个.aspx页面当中使用这个新的用户控件,你必须首先初始化@Register指令。当使用这个标签的时候,你必须定义标签前缀,标签名字以及指定用户控件所在的源文件。 
   
   
   
  TagPrefix定义了我们使用这个用户控件的时候想要用的名称空间。TagName定义了这个用户控件的实际名称。你可以任意的命名你的控件,这个名字将会用在页面上面标示用户控件。 
  当你加入一个用户控件到一个.aspx页面的时候,相应的语法同加入一个web控件类似。你首先使用标签前缀和标签名称来标示用户控件:

现在我们在页面上面有了这个空间,我们可以设置标准的runat和id属性,以及设置我们以前建立控件的时候建立的各个自己定义的属性。有两种方法来修改这些用户控件的属性(就像针对一个ASP.NET的web控件那样)。一种方法是在你的web页面当中引用这个用户控件的时候明确的设置它的各个属性的值。在我们的例子当中,我们设置LabelText属性为“Product Name”,因为我们的搜索是针对产品名称来讲的。 
   
   
   
  另外一种方法是在一个.aspx文件的page_load事件中设置这些用户控件的属性。针对我们的例子,我们在page_load事件当中设置ConnectionString,TableName,ConditionField属性。我们需要搜索的是数据库Northwind中Product表的ProductName字段。 
   
  Sub page_load(objSource as Object, objArgs as eventArgs) 
  Dim htConfig As HashTable 
  '设置一个对Config.web文件中AppSettings节点的应用 
  htConfig = Context.GetConfig("appsettings") 
   
  '设置用户控件的连接字符串 
  userControl.ConnectionString=(htConfig("MyConn")) 
   
  '设置我们要搜索的表的名称 
  userControl.TableName="Product" 
   
  '设置我们要搜索的字段名称 
  userControl.ConditionField="ProductName" 
  对于我们的web站点,我们将数据库的连接字符串存放在Config.web文件当中的叫做appsettings中的区域中。(如果要使用下面的代码,请将server修改成你实际的server名字) 
   
   
   
   
  下面是我们的.aspx文件第一次看起来的样子: 
   
   
   
  现在我们需要加入代码来调用我们的用户控件中的search方法。我们编写这个用户控件的例子的目的是为了实现对数据库的简单搜索以及返回搜索的结果。为了做到这些,我们有两个选择,我们要么在我们的用户控件当中将我们的结果放到我们的结果控件(在这里,一般是一个DataGrid控件),要么我们将一个ADO记录集当作一个属性返回给开发者,而不必关心开发者究竟使用什么方法来显示他。我们的选择是通过一个属性返回一个记录集结果,因为这样做可以使得开发者可以自由的选择使用什么控件以及采用什么样的数据显示方式。 
  然而这个选择同时也带给了我们一些问题。我们可以容易的将结果当作一个属性返回并且使用DataSource属性绑定到一个DataGrid控件或者其他的控件。但是,我们如何才能知道用户是否是点击了一个搜索按钮呢?为了解决这个问题,我们需要在page_load事件中使用Page.IsPostBack这个属性。如果一个页面是由于post而重载的话,属性Page.Ispostback的值等于true。通过检测page.ispostback是否等于true,我们可以决定是否调用我们的用户控件中的Search方法,然后将结果绑定到我们的datagrid。 
   
  '检测Page.IsPostBack属性的值 
  If page.IsPostback = true then 
  '执行搜索的动作 
  userControl.Search(objSource, objArgs) 
  '将结果绑定到DataGrid控件上面 
  grdGrid.datasource = userControl.ResultSetView 
  '正式绑定数据 
  grdGrid.databind() 
  End If 
  End Sub 
  在某个人输入了一个搜索条件之后并提交我们的.aspx文件之后的显示页面: 
   
   
   
  现在我们可以同样的建立另外一个页面以便使用在我们的站点。我们将要建立的这第二个页面同样执行一个搜索动作,但是这次是要在Northwind数据库的表Company上的CompanyName字段上面进行搜索匹配。为了建立这个页面,我们建立一个新的空白.aspx文件。既然这个页面和我们的产品页面类似,我们使用相同的布局。我们将要再一次使用搜索用户控件。 
   
   
   
  我们在这个页面会将属性设置不同的值。联接字符串还是保留使用前面同样的值。我们需要设置属性LabelText的值等于Company Name,设置属性Table的值等于Company,设置属性ConditionField的值等于CompanyName。通过对布局和用户控件的略微改动,我们就算大致完成了这个页面。对这个页面来讲,我们只需要很少的代码,这要好好谢谢用户控件带来的代码重用了。下面就是我们新的页面: 
   
   
   
  正如你所看到的,用户控件可以提供一个简便的方法来实现代码的可重用性,而省去了很多不必要的麻烦。将相关的控件和代码从一个ASPX文件移到一个ASCX文件当中是一个恰当的做法,并且只需要较小的修改就可以使得代码正常的工作了。 
   
  局限性? 
  你也许会问自己:我使用用户控件不能够做到什么?使用这个技术只存在很少的一些限制。 
  其中的一个限制是:用户控件不支持模版。因此,你不能建立一个用户控件来达到ASP.NET中提供的Data Repeater控件的功能。 
  另外的一个限制是:由于用户控件必须包含一些静态的UI(用户界面)属性,所以你不能够按照你的想法严格的调整他们。比如,你可能想要建立一个包含多个控件的用户控件,并且允许开发者能够指定这些控件在页面上的显示顺序。上面的想法对于一个用户控件来说是困难的,因为UI块是被静态的设置的。 
   
  结论 
  用户控件提供了一个极好的方法使得你能够非常容易的在你的ASP.NET页面中实现代码的重用。将一些在ASP.NET中的代码拖放到ASCX文件中使得他们能够被重新利用是个正确的选择和做法。 
  在我们的文章中,我们一同探讨了通过定制的控件实现代码在ASP.NET中的重用。可定制的ASP.NET控件可以对可重用代码提供附加的弹性,正如上面我们已经学到那样。

(0)

相关推荐

  • web用户控件调用.aspx页面里的方法

    现在把此web用户控件添加到一.aspx页面中.要实现单击用户控件中的button控件把搜索出来的结果数据绑定到.aspx页面的gridview控件上去,如何实现呢? 如果gridview控件是放在.ascx文件中的话,那我们直接把搜索出来的数据绑定到它上面就行了.但现在gridview是放在.aspx文件里,也就是说web用户控件要如何才能访问母页面的控件,把数据绑定到母页面的控件上去? 解决方法: 1.先在.aspx页面的后台文件.aspx.cs中添加一个绑定数据的方法,代码如下: 复制代码

  • asp.net 用户控件读取以及赋值

    XML内容如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <SystemVersion> <Item> <Version_ID>1</Version_ID> <Version_Name>CN</Version_Name> </Item> <Item> <Version_ID>2</

  • C#自定义控件VS用户控件

    C#中自定义控件VS用户控件大比拼 1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件 自定义控件(Custom Control):继承自 Control,主要用于开发windows控件的最基本的类,比如 Text,Button 控件 2 要开发自己的控件的几种方法[1] 复合控件(Composite Controls):将现有的各种

  • C#实现用户自定义控件中嵌入自己的图标

    本文实例讲述了C#实现用户自定义控件中嵌入自己的图标.分享给大家供大家参考,具体如下: 下面给出一下具体的步骤. 1. 新建一个用户控件 2. 向资源文件是添加一张图片,图片格式可以是bm,ico 大小最好是 16 * 16 啦! 3. 选中用户控件图标,单击"右键>属性"把 "生成操作 的属性值改为:嵌入的资源(Action Resource) 4. 第四步: [ToolboxBitmap(typeof(CutPitureNew_WPF), "CutPitu

  • 解析C#自定义控件的制作与使用实例的详解

    上篇:控件制作本例是制作一个简单的自定义控件,然后用一个简单的测试程序,对于初学者来说,本例子比较简单,只能起到抛石引玉的效果.我也是在学习当中,今后会将自己所学的逐步写出来和大家交流共享.第一步:新建一个控件库项目:myControl 第二步:从工具箱里面拖动1个PictureBox.1个Button.6个Lable控件到用户界面上,布局如下: 如上图,设置pictureBox的Name为picBox,背景为白色,Button的Name为btnOpen,另外靠左的三个Lable的Text属性分

  • .Net WInform开发笔记(三)谈谈自制控件(自定义控件)

    末日这天写篇博客吧,既然没来,那就纪念一下. 这次谈谈自制控件,也就是自定义控件,先上图,再说 1.扩展OpenFileDialog,在OpenFileDialog中添加各种文件(.txt,.jpg,.excel等等)的预览功能 2.重写ListBox,增加折叠.鼠标背影.分类等功能 -----------------------------分割线--------------------------------------------------------------一.扩展OpenFileD

  • 简介Winform中创建用户控件

    步骤: 1.创建一个项目,该项目主要用来设计用户控件. 2.创建一个用户控件窗体,用来设计用户控件. 3.向用户控件窗体中添加一个按钮(button1),给它添加相应的移入.移出事件,实现移入时按钮的背景设置一个图片,移出的时候背景设置另一个图片. 复制代码 代码如下: private void button1_MouseEnter(object sender, EventArgs e)        {            this.button1.Image = Image.FromFil

  • asp.net页面master页面与ascx用户控件传值的问题

    aspx 页面与ascx用户控件传值的问题 1.建立ascx控件 2.给ascx加上属性 3.将控件拖入aspx中 4.在aspx的代码中按控件ID访问属性 如: <uc3:left_Repassword ID="left_Repassword1" runat="server" /> left_Repassword1.HighLight = value; 也同样适用于master页面访问ascx ASP.Net访问母版页(MasterPage)控件.属性

  • asp.net动态加载用户控件,关于后台添加、修改的思考

    看下下面这个典型的后台(比较粗糙):说实在,我很厌倦全部用.aspx文件去做,比如"友情连接"这个模块,就有"添加友情连接""修改友情连接""友情连接列表",简单的话,可以把"添加""修改"合成一个文件.每次都去建立一个.aspx文件.我现在的想法是用"用户控件+配置文件"去实现,虽然文件数目可能不会少很多.但在编程到一定地步,我想大家会有跟我一样的想法. 首先需要涉

  • C#自定义控件添加右键菜单的方法

    C#自定义控件添加右键菜单非常简单,主要用到控件,像control定义右键菜单,用items.add()叠加右键菜单内容,用click事件处理函数. 1.control是要定义右键菜单的控件. private void control_MouseDown(object sender, MouseEventArgs e) {    if (e.Button == MouseButtons.Right)    {        ContextMenu menu = new rightClickMen

随机推荐