熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用戶控件包裝器的設計與實現

2013-11-13 10:07:50  來源: .NET編程 

  引言

  SPS是一個安全可伸縮的企業級門戶服務器可以利用它將SharePoint 站點信息和應用程序匯集到一個單一的門戶位置用戶可以通過門戶內容和布局進行個性化的定制更快地找到相關信息目前許多企業和政府部門已開始基於SPS服務在互聯網上提供信息共享與應用服務並構建跨企業的虛擬組織或虛擬企業以實現大規模的資源共享Web Part的自定義開發是實現基於SPS上的復雜應用的關鍵微軟官方提供的Web Partforvs模版是開發Web Part的標准編程環境但是非常可惜它不提供Web Part開發的可視化界面對於復雜界面的Web Part的開發將是一件非常吃力的事情用戶控件包裝器巧妙的利用Web Partforvs模版通過Web Part的屬性將用戶控件載入頁面通過菜單編輯用戶控件通過Web Part的數據傳遞實現用戶控件之間的數據傳遞

   用戶控件與Web Part的聯系

  ASPNET為擴展服務器控件框架提供了兩個抽象用戶控件和自定義控件

  用戶控件實質上是可插入其他頁面中的 ASPNET 頁面它們在一定程度上類似於傳統 ASP 中使用的 Include 文件使用 Visual Studio NET可以使用將控件拖到頁面設計器的方式將服務器控件拖到用戶控件設計器上從而輕松地構建用戶控件

  ASPNET自定義控件實質是一個從SystemWebUIControl直接或間接繼承於的類它不受Visual Studio NET中圖形工具的支持可以通過覆蓋SystemWebUIControl的CreateChildControls 方法往自定義控件中添加服務器控件定義其屬性和事件然後覆蓋Control類的Render方法(直接繼承於Control類)或覆蓋WebControl類的RenderContent方法(繼承於WebControl類)編寫自己的代碼來發出 html

  Web Part是SPS網站上的基本單元它的概念類似於ASPNET自定義控件自己開發的Web Part將從MicrosoftSharePointWeb PartPagesWebPart類繼承也是間接的繼承了SystemWebUIControl類一樣可以通過覆蓋SystemWebUIControl的CreateChildControls方法添加服務器控件定義其屬性和事件然後覆蓋WebPart類的RenderWebPart方法編寫自己的代碼發出html

  Web Part可以通過添加子控件的方式將用戶控件和自身相聯系需要定義的大量用戶界面和業務事件在用戶控件中完成Web Part起著選擇用戶控件編輯用戶控件和傳遞用戶控件數據的作用

   用戶控件包裝器的具體實現

  用戶控件的載入和屬性編輯

  用戶控件的載入和屬性編輯都借助了Web Part的屬性和工具面板Web Part的屬性分為默認屬性和自定義屬性默認屬性對Web Part的外觀(如標題高度寬度)布局(如所在Web Part區域顯示的次序)和更高級的控制(如是否允許關閉是否允許區域更改及選擇訪問Web Part的群體)進行了設置是Web Part自帶的屬性自定義屬性是用戶自已定義的屬性便於更靈活的編輯Web Part

  工具面板由不同的Tool Part組成

  默認屬性對應WebPartToolPart類自定義屬性對應CustomPropertyToolPart類這兩個類都繼承於ToolPart類WebPart類的GetToolParts方法決定將哪些Tool Part顯示在工具面板裡Web Part框架默認在該方法中將這兩個類的實例寫入ToolPart數組中這兩個屬性將被工具面板中對應的Tool Part所編輯同理創建繼承於ToolPart的類就可以在工具面板中很好的控制Web Part中除了屬性的內容

   用戶控件的載入

  用戶控件的載入通過Web Part的自定義屬性和工具面板實現主要步驟如下

  () 將用戶控件對應的dll文件放入SPS的bin目錄下以待執行

  () 創建WebPart的子類

  () 在子類中添加一個自定義屬性用於保存載入的用戶控件的完整路徑

  () 創建ToolPart的子類

  () 將ascx文件放在SPS的某個虛擬目錄下在ToolPart子類中實現從該虛擬目錄獲取所有用戶控件信息的方法

  () 在ToolPart子類中實現一個返回一個字符串的方法該字符串用於創建一個項值為用戶控件完整路徑項的文本為用戶控件名稱或描述的下拉列表框

  () ToolPart的子類覆蓋虛方法RenderToolPart(HtmlTextWriter)將第步得到的字符串傳入並被HtmlTextWriter對象寫到浏覽器上用於在工具面板中顯示包含所有用戶控件的下拉列表框

  () ToolPart的子類覆蓋虛方法ApplyChanges(該虛方法用於用戶點擊工具面板中的確定應用按鈕時發生將相應Tool Part中的值作編輯)將通過表單形式提交到服務器端的下拉列表框的選中值傳給相應Web Part的保存用戶控件路徑的自定義屬性通過該屬性載入用戶控件

  () WebPart的子類覆蓋虛方法GetToolParts在該方法中返回的ToolPart數組中加入第步創建的類的實例

  () WebPart的子類覆蓋虛方法CreateChildControls將載入的用戶控件作為Web Part的子控件加入

  () WebPart的子類覆蓋虛方法RenderWebPart通過RenderControl方法將該用戶控件呈現到浏覽器上

  當載入用戶控件後可以將用戶控件屬性映射到工具面板的一個Tool Part上通過Tool Part來編輯用戶控件屬性主要步驟如下

  ()創建ToolPart的另一個子類添加一個自定義屬性將載入的用戶控件傳給它

  () WebPart的子類覆蓋WebPart的虛方法GetToolParts在該方法中返回的ToolPart數組中加入第步創建的類的實例

  () 創建一個編輯不同類型屬性的基類將載入的用戶控件及及時的http請求和要求編輯的屬性傳給它在該類的子類中具體實現不同類型屬性的編輯基類中創建一個返回一個字符串的抽象方法該字符串是編輯屬性的html控件的html標記的字符串形式在子類中對該方法進行具體實現

  () 創建一個編輯用戶控件所有屬性的類該類利用第步創建的類逐一將編輯用戶控件屬性的html控件封裝進一個HtmlTable中

  () 第步創建的類覆蓋ToolPart的虛方法RenderToolPart利用第步創建的類將對應用戶控件屬性信息的一個HtmlTable呈現到工具面板當中

  以上步驟將用戶控件的屬性映射到工具面板的一個Tool Part當中以下步驟將實現通過Tool Part編輯用戶控件的屬性

  () 在WebPart的子類中添加一個自定義屬性保存用戶控件的所有屬性值

  () 在WebPart的子類中實現一個由外部傳入的屬性新值更新保存屬性值的自定義屬性的方法

  () 在WebPart的子類中實現一個利用上述自定義屬性更新用戶控件屬性的方法

  () 在編輯不同類型屬性的基類中創建一個返回Object類型的抽象函數該返回值代表以表單形式提交到服務器端的編輯屬性的html控件的值該抽象函數在子類中得到具體的實現

  () 第步創建的類覆蓋ToolPart的虛方法ApplyChanges利用第步創建的函數得到提交到服務器端的html控件值將該值傳給WebPart的子類更新保存屬性值的自定義屬性然後利用該自定義屬性更新用戶控件的屬性值

   用戶控件的編輯

  菜單是Web Part的一個重要組成部分菜單的充分利用可以對Web Part的內容進行方便的編輯Web Part自帶的菜單可以實現對Web Part進行有效的編輯這裡介紹利用菜單實現對用戶控件的復制和粘貼

  確定一個用戶控件的完整信息需要得到用戶控件的路徑及用戶控件的所有屬性可以考慮將這兩者復制到一個剪切板類的靜態成員在該類的所有實例裡擁有一樣的值巧妙地起到剪切板的作用基於這個思想在WebPart的子類中添加兩個靜態域用於保存用戶控件的信息

  復制過程

  () 添加復制菜單及相應菜單的服務器端函數

  () 在函數中將WebPart子類中的自定義屬性的值賦予添加的兩個靜態域

  粘貼過程

  () 添加粘貼菜單及相應菜單的服務器端函數

  () 在函數中將兩個靜態域的值賦予WebPart子類的自定義屬性

  () 根據保存用戶控件路徑的自定義屬性添加用戶控件

  () 根據保存用戶控件屬性的自定義屬性賦予用戶控件新的屬性值

  () 保存自定義屬性的值以便再次加載頁面時用戶控件的狀態得以保留

   用戶控件之間的數值傳遞

   Web Part之間的數值傳遞

  用戶控件之間的數值傳遞依賴於Web Part之間的數值傳遞Web Part之間的數值通過實現Web Part框架提供的對接口之一得以傳遞對接口分別是

  連接的接口對

  描述

  ICellProvider ICellConsumer

  由實現ICellProvider的對象提供一個Object類型的單一值給實現ICellConsumer的對象實現ICellConsumer的對象在接收值之前可以向實現ICellProvider的對象提供String類型的初始信息實現ICellProvider的對象也可以在發送值之前向實現ICellConsumer的對象提供String類型的初始信息

  IRowProvider IRowConsumer

  由實現IRowProvider的對象提供一個DataRow類型的數組給IRowConsumer實現IRowProvider的對象在傳遞值之前可以向實現IRowConsumer的對象提供String類型的初始信息

  IListProvider IListConsumer

  由實現IListProvider的對象提供一個DataTable類型的數給IListConsumer的對象實現IRowProvider的對象在傳遞值之前可以向實現IRowConsumer的對象提供String類型的初始信息

  IFilterProvider IFilterConsumer

  提供或者消費一個String類型的過濾值的接口對 例如SharePoint列表實現了IRowProvider IListProvider IFilterConsumer 那麼兩個不同的列表能夠互相連接並且一個列表可以過濾另一個列表的內容

  IParametersInProvider IParametersInConsumer

  實現IParametersInProvider接口的對象可以向IParametersInConsumer的對象提供任意組的參數值值的內容由String類型組成實現IParametersInConsumer的對象在接受參數之前可以向實現IParametersInProvider的對象提供所需參數的初始信息

  IParametersOutProvider IParametersOutConsumer

  實現IParametersOutProvider接口的對象可以向IParametersOutConsumer的對象提供任意組的參數值值得內容由string類型組成實現IParametersOutProvider的對象在發送參數之前可以向實現IParametersOutConsumer的對象提供所需參數的初始信息

  Web Part連接的設計和SharePoint的對象模型有緊密的聯系但是從本質上說提供的數據類型分為Object和String兩大類(DataRow和DataTable實際上也就是Object類型的數組組成)提供的相關信息都是String類型方向要麼由數據者提供向數據者接收提前發送要麼由數據者接收向數據者提供者提前發送用戶控件對數據交流的最大要求是既可以傳遞數據又可以接收數據並且可以是任意類型的數據類型一個Web Part可以實現多個接口以實現既傳遞數據又接受數據的功能但是兩個Web Part之間不能既提供數據給對方又從對方接受數據這樣將形成閉環可以考慮的方案是傳遞數據而接收數據的初始化信息綜上因素ICellProvider和ICellConsumer是不錯的選擇因為傳遞的數據是Object類型而接收方可以提前傳遞初始化信息給發送方主要實現步驟如下

  () 創建供用戶控件待以實現的數據提供接口和數據接收接口

  () 創建兩個類分別用於實現ICellProvder和ICellConsumer接口

  () 在WebPart的子類中添加第步創建的類的對象作為域成員

  () 在WebPart的子類中覆蓋虛方法EnsureInterfaces根據包裝的用戶控件實現的接口類型注冊ICellProvider接口或ICellConsumer接口

  () 在WebPart的子類中覆蓋虛方法CanRunAt指明連接的位置在服務器端還是客戶端

  () 在WebPart的子類中覆蓋虛方法PartCommunicationConnect該方法被Web Part框架用來通知Web Part已被連接

  () 在WebPart的子類中覆蓋虛方法PartCommunicationInit該方法被Web Part框架用來傳送初始化信息注冊了ICellConsumer的Web Part可以從用戶控件得到要傳送的初始化信息在實現ICellConsumer的域成員中進行傳送注冊了ICellProvider的Web Part也可以從用戶控件得到要傳送的初始化信息在實現ICellProvider的域成員中進行傳送

  () 在WebPart的子類中覆蓋虛方法PartCommunicationMain注冊了ICellProvider的Web Part可以將實現ICellProvider的域成員在此方法中得到的傳遞過來的初始化信息轉發給用戶控件注冊了ICellConsumer的Web Part也可以將實現ICellConsumer的域成員在此方法中得到的傳遞過來的初始化信息轉發給用戶控件同時注冊了ICellProvider接口的Web Part可以在此時接收用戶控件傳來的數據利用實現ICellProvider的域成員發送數據給注冊ICellConsumer接口的Web Part

  () 在WebPart的子類中覆蓋虛方法RenderWebPart注冊了ICellConsumer接口的Web Part的實現ICellConsumer的域成員在此方法中得到注冊了ICellProvider的Web Part傳來的數據注冊了ICellConsumer接口的Web Part可以將數據傳遞給包裝的用戶控件將用戶控件呈現在浏覽器上

  這些虛方法都是Web Part框架依次調用次序和步驟順序一致

  結束語

  用戶控件包裝器是巧妙的利用Web Part本身的功能將Web Part的缺陷加以克服它的實現給Web Part的開發帶來極大的便利ASPNET程序員根本就不需要理解Web Part的開發原理就可以利用以往的編程思想快速地開發自己需要的Web Part進而使得SPS的門戶網站開發和設計事半功倍


From:http://tw.wingwit.com/Article/program/net/201311/12648.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.