另外一種方法是在一個.aspx文件的page_load事件中設置這些用戶控件的屬性。針對我們的例子,我們在page_load事件當中設置ConnectionString,TableName,ConditionField屬性。我們需要搜索的是數(shù)據(jù)庫Northwind中Product表的ProductName字段。
Sub page_load(objSource as Object, objArgs as eventArgs)
Dim htConfig As HashTable
'設置一個對Config.web文件中AppSettings節(jié)點的應用
htConfig = Context.GetConfig("appsettings")
'設置用戶控件的連接字符串
userControl.ConnectionString=(htConfig("MyConn"))
'設置我們要搜索的表的名稱
userControl.TableName="Product"
'設置我們要搜索的字段名稱
userControl.ConditionField="ProductName"
對于我們的web站點,我們將數(shù)據(jù)庫的連接字符串存放在Config.web文件當中的叫做appsettings中的區(qū)域中。(如果要使用下面的代碼,請將server修改成你實際的server名字)
database=Northwind"/>
下面是我們的.aspx文件第一次看起來的樣子:
現(xiàn)在我們需要加入代碼來調(diào)用我們的用戶控件中的search方法。我們編寫這個用戶控件的例子的目的是為了實現(xiàn)對數(shù)據(jù)庫的簡單搜索以及返回搜索的結(jié)果。為了做到這些,我們有兩個選擇,我們要么在我們的用戶控件當中將我們的結(jié)果放到我們的結(jié)果控件(在這里,一般是一個DataGrid控件),要么我們將一個ADO記錄集當作一個屬性返回給開發(fā)者,而不必關心開發(fā)者究竟使用什么方法來顯示他。我們的選擇是通過一個屬性返回一個記錄集結(jié)果,因為這樣做可以使得開發(fā)者可以自由的選擇使用什么控件以及采用什么樣的數(shù)據(jù)顯示方式。
然而這個選擇同時也帶給了我們一些問題。我們可以容易的將結(jié)果當作一個屬性返回并且使用DataSource屬性綁定到一個DataGrid控件或者其他的控件。但是,我們?nèi)绾尾拍苤烙脩羰欠袷屈c擊了一個搜索按鈕呢?為了解決這個問題,我們需要在page_load事件中使用Page.IsPostBack這個屬性。如果一個頁面是由于post而重載的話,屬性Page.Ispostback的值等于true。通過檢測page.ispostback是否等于true,我們可以決定是否調(diào)用我們的用戶控件中的Search方法,然后將結(jié)果綁定到我們的datagrid。
'檢測Page.IsPostBack屬性的值
If page.IsPostback = true then
'執(zhí)行搜索的動作
userControl.Search(objSource, objArgs)
'將結(jié)果綁定到DataGrid控件上面
grdGrid.datasource = userControl.ResultSetView
'正式綁定數(shù)據(jù)
grdGrid.databind()
End If
End Sub
在某個人輸入了一個搜索條件之后并提交我們的.aspx文件之后的顯示頁面:
現(xiàn)在我們可以同樣的建立另外一個頁面以便使用在我們的站點。我們將要建立的這第二個頁面同樣執(zhí)行一個搜索動作,但是這次是要在Northwind數(shù)據(jù)庫的表Company上的CompanyName字段上面進行搜索匹配。為了建立這個頁面,我們建立一個新的空白.aspx文件。既然這個頁面和我們的產(chǎn)品頁面類似,我們使用相同的布局。我們將要再一次使用搜索用戶控件。
我們在這個頁面會將屬性設置不同的值。聯(lián)接字符串還是保留使用前面同樣的值。我們需要設置屬性LabelText的值等于Company Name,設置屬性Table的值等于Company,設置屬性ConditionField的值等于CompanyName。通過對布局和用戶控件的略微改動,我們就算大致完成了這個頁面。對這個頁面來講,我們只需要很少的代碼,這要好好謝謝用戶控件帶來的代碼重用了。下面就是我們新的頁面:
正如你所看到的,用戶控件可以提供一個簡便的方法來實現(xiàn)代碼的可重用性,而省去了很多不必要的麻煩。將相關的控件和代碼從一個ASPX文件移到一個ASCX文件當中是一個恰當?shù)淖龇ǎ⑶抑恍枰^小的修改就可以使得代碼正常的工作了。
局限性?
你也許會問自己:我使用用戶控件不能夠做到什么?使用這個技術只存在很少的一些限制。
其中的一個限制是:用戶控件不支持模版。因此,你不能建立一個用戶控件來達到ASP.NET中提供的Data Repeater控件的功能。
另外的一個限制是:由于用戶控件必須包含一些靜態(tài)的UI(用戶界面)屬性,所以你不能夠按照你的想法嚴格的調(diào)整他們。比如,你可能想要建立一個包含多個控件的用戶控件,并且允許開發(fā)者能夠指定這些控件在頁面上的顯示順序。上面的想法對于一個用戶控件來說是困難的,因為UI塊是被靜態(tài)的設置的。
結(jié)論
用戶控件提供了一個極好的方法使得你能夠非常容易的在你的ASP.NET頁面中實現(xiàn)代碼的重用。將一些在ASP.NET中的代碼拖放到ASCX文件中使得他們能夠被重新利用是個正確的選擇和做法。
在我們的文章中,我們一同探討了通過定制的控件實現(xiàn)代碼在ASP.NET中的重用??啥ㄖ频腁SP.NET控件可以對可重用代碼提供附加的彈性,正如上面我們已經(jīng)學到那樣。