asp.net|菜單|控制項 為ASP.NET控制項加入捷徑功能表(1)
雖然捷徑功能表在傳統型應用程式中已經是非常通用的元素,但是由於在象ASP.NET這樣的基於伺服器的技術沒有很好的描繪,所以在Web應用程式中捷徑功能表並不是很通用。要想使用捷徑功能表,瀏覽器必須高度支援DHTML和豐富事件模式,例如:Microsoft® Internet Explorer 5.0及更高版本,或者Netscape 6.0等。然而,各種瀏覽器的對象模式雖然功能上大至相同,但是成員各名字卻各不相同,這就需要我們自己實現對象和事件的從一種模式到到另一種模式的轉換。
這裡,我們建立一個針到Internet Explorer的對象模式的ASP.NET捷徑功能表。接著,我將經過修改使其功能支援其它瀏覽器。代碼支援ASP.NET 1.x,也可以在ASP.NET2.0 Beta1下編譯通過 Outline of the
ContextMenu Control 捷徑功能表控制項概述:
MSDN Liabrary 中包含了幾個DHTML捷徑功能表的樣本。分別提供了對這一功能的不能實現方法。一個捷徑功能表就是在頁面中任何位置的一組標記代碼。它包括兩部分內容——介面和指令碼(當使用者在頁面右擊時關聯UI),UI提供一個可點擊的元素的列表——功能表項目——和各自的內容文本,表徵圖,命令名(command name),目標url,提示(tooltip),和所有你認為有必要顯示出來的東西。捷徑功能表介面是頁面的一部分,並且屬於頁面控制項樹中的一員。(太多的捷徑功能表將會出現執行的問題:與大多數使用者的常規情況相比,ASP.NET將發送更多的捷徑功能表到瀏覽器)當使用者在頁面的一個元素上右擊時,將引發一段JavaScript,這段指令碼將捷徑功能表移動到右擊的位置顯示。
捷徑功能表將保持隱藏屬性,只有當使用者在頁面的一個綁定個捷徑功能表的元素上右擊時,捷徑功能表才顯示。頁面元素接收指令碼事件並彈出一個捷徑功能表作為響應。指令碼事件信賴於瀏覽器,在Internet Explorer 5.0和更新版本中是 OnContexMenu事件.在Netscape6.0和更新版本中你要使用 OnMouseUp 事件(在Internet Explorer 5.0+中你也可能使用OnMouseUp事件,但要多寫幾行代碼)在接收事件的指令碼中,擷取捷徑功能表的UI代碼塊並且將它移動到發生點擊的位置。同時設定彈出的panel的 visibilty屬性。當使用者在功能表項目上點擊時,頁面回傳並引發伺服器端事件。對於伺服器而言,點擊一個功能表項目和點擊一具常規的按鈕沒什麼區別。
在Visual Studio .NET 2003 整合式開發環境中,ASP.NET複合控制項可以很好的完成這一工作。可以通過使用類撰寫組合現有控制項來創作新控制項。複合控制項可呈現一個重新使用現有控制項功能的使用者介面。複合控制項可以從子控制項的屬性合成屬性並處理由子控制項引發的事件。它還可以公開自訂屬性和事件。
我不選擇使用複合控制項有以下幾個原因:一個是Visual Studio .NET 2003對於Web表單中的控制項功能的擴充支援的不好(請參見:Extender provider components in ASP.NET: an IExtenderProvider implementation),第二,在Visual Studio 2005的ASP.NET設計器中不再支援組件托盤區。Web表單設計器現在僅支援ASP.NET控制項而忽略象複合控制項這樣的非可視化的組件。Visual Studio 2005將不再信賴InitializeComponent節,並且不再在代碼檔案中自動添任何工具產生(tool-generated)的代碼。ASP.NET控制項也不設計成具有捷徑功能表,所以要綁定捷徑功能表只能通過捷徑功能表控制項自身的執行。這裡我使用類似ASP.NET驗證控制項和被驗證控制項之間關聯的形式。