ASP.NET使用者控制項技術

來源:互聯網
上載者:User

我們發現,利用代碼綁定技術我們可以容易的將我們的代碼和內容分離開來,利用它可以建立可重用的代碼,只是這種技術本身也存在著一些局限性。在本文中,我們將會一同探討另外一種新的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控制項可以對可重用代碼提供附加的彈性,正如上面我們已經學到那樣。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.