功能導航主要解決如何布局功能,把功能如何合理的布置到頁面中。現在流行的一種方案是左右結構的導航,左邊樹狀的菜單,右邊顯示明細功能。實現出來的如下所示
同版本的C/S程式的介面,也是以同樣的效果出現
Web左邊點擊樹節點,右邊開啟相應的功能列表,顯示該節點下面有哪些功能。而這些功能節點,均是用菜單設計器設計實現,以方便客戶定製主介面。菜單設計器的設計樣式如下
關於如何?樹節點的母子關係,有很多辦法。一種辦法是給樹的每個節點加一個ParentId,用於指示它的上一級節點,這樣每設計一個節點,均需要指出它的父節點,以用於呈現母子關係。另一種方法,以本例子中實現為例子,1002為Sales的樹節點,它的子節點全部用1002XX來標識,如中所示,100201表示日記帳,100202表示報表,100203表示查詢。前一種方法,請參考架構資料庫中的表X_Menu,後一種請參考表UserGroupMenu。
導航的另一個目的,要實現中英文自動切換,以方便不同的使用者習慣偏好。Enterprise Solution系列的組件,均內建了中英文切換的功能,可以在Settings中,選擇習慣的語言進行設定。對於Web應用程式,使用者的語言偏好儲存在瀏覽器的Cookie中,對於C/S程式,使用者的語言偏好儲存在註冊表中。
再來看看,如何快速的找到需要的功能,並開啟執行它。如果您習慣在左邊的菜單中尋找,則可以直接在菜單對應的右邊的功能列表地區中,開啟該功能。另一種方法是,在快速啟動欄中輸入功能編碼,點擊Go按鈕,此時,它會在新的選項中頁面中,開啟此功能。一般來說,系統預置了三種類型的功能
如何讓一個ASP.NET頁面成為功能點,並自動被系統架構找到呢? 請參考下面的例子代碼
[Function("AIITRL", "~/module/note.aspx")]public partial class note : EntryPageBase{ protected override void PageLoadEvent(object sender, EventArgs e) { if (!IsPostBack) TransactionType = "BlotterEntity"; base.PageLoadEvent(sender, e); }}
給頁面加Function特性,第一個參數是功能編碼,第二個參數是頁面的絕對位址。當在快速啟動欄中輸入AIITRL時,架構會找到(反射)此頁面,並在新的索引標籤頁面面中開啟載入此功能。
這裡要提到一點不足,對於ASP.NET,它是被瀏覽器請求執行。不同於C/S,可以new一個表單,然後Show。我一直在尋找一種方法,可以通過頁面的類型,來找到這個頁面所在的aspx檔案地址,這樣可以省略Function特性的第二個參數,到目前一直沒有找到可行的方案。第二個參數可以通過菜單設計器來輔助完成,不過原理和這裡的差不多,也是人工識別,所以,我直接把地址放在特性參數中,以用於導航。
第二類功能是報表。先在報表設計師中設計此報表,給予一個編號,參考如所示
在報表設計表單中,給予基本的參數。然後在Web項目的report目錄中,放置報表檔案。理論上,需要支援三大流行的報表系統。RDLC,微軟用戶端報表,簡單,易用,Crystal Report 水晶報表,功能複雜強大,Reporting Services 微軟伺服器端報表。Enterprise Solution Web部分,目前只實現了RDLC用戶端報表,其它二項報表的功能,還有待研究和實現。這裡要提到一點,加入一種類型的報表,要實現如下的準系統:
1 多語言 基本的中,英,繁體
2 多種版本。Crystal Report 有多種版本,要能識別各個版本的報表檔案並載入合適的轉譯器(Render)
3 介面輸入與傳值。有的報表需要傳遞參數,系統要創造介面輸入值,並自動的傳入到報表中
第三類功能是自訂查詢。使用者在查詢設計工具中設計的查詢,Web架構要能解析成介面,呈現給使用者。
在此設計的查詢,通過在快速啟動欄中輸入PUPRSQ功能編碼,呈現給使用者如下效果的介面
查詢的結果,可以匯出為EXCEL。關於如何將query轉換為Web介面,在後續的文章中會講解原理,在此先略過。
導航功能的好壞,對系統的可用性,有一定的影響。試想一下,功能很複雜的一個系統,使用者要找一個功能,要找很久都找不到,或是沒有快捷的途徑找到它,使用者肯定不會認為它好用。其次,快速啟動欄的設計,用一個功能編碼標識使用者需要的一個功能模組,有利於使用者快速執行所需要的功能。進階的使用者不想去樹節點中找,則可以此方法執行功能。
最後,導覽功能表是可編輯的,提供一個菜單編輯器,隨心所欲的設計使用者所需要的效果。