答案: 现在我们在页面上面有了这个空间,我们可以设置标准的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控件可以对可重用代码提供附加的弹性,正如上面我们已经学到那样。
上一个:ASP.NET程序员应用程序域须知
下一个:ASP.NET用户控件技术(1)