網站中如果存在很多個分頁檔(aspx頁),我會把檔案放在不同的檔案夾中,具體要根據什麼把檔案放到不同的檔案夾中,我也不知道,呵呵。我自己通常是這樣分的:一是將共同完成某一個功能的分頁檔放在同一個檔案夾;二是根據使用者的訪問限制(不同角色的使用者能訪問的檔案不一樣)。
這幾天閑著沒事做,所以就參考園子裡前輩的思路,模仿著寫了兩個網站導航的例子,以後做其它項目的時候如果要用到網站導航控制項的東西,就相對熟悉一些了。
一:ASP.NET網站導覽樣本1
這裡直接利用web.sitemap,將檔案的連結寫在sitemap中,同時配置好不同頁面的角色訪問限制(利用siteMapNode的roles屬性),web.config中也進行了以下限制:
Code
<!--Parent1:the user in role 0,2-->
<location path="Parent1">
<system.web>
<authorization>
<allow roles="0,2" />
<deny users="*" />
</authorization>
</system.web>
</location>
之所以在web.config中也進行限制,是為了限制不具有“0,2” 這種角色的使用者訪問Parent1這個檔案夾中的任何檔案。這跟在導航控制項(TreeView\Menu)顯示Parent1檔案夾中的檔案完全是兩回事,不具有“0,2”角色的使用者能看到Parent1檔案夾中的檔案的連結(這是因為在sitemap中的siteMapNode節點的roles屬性中指定了角色,我根據這個角色將這個檔案連結節點添加到導航控制項中),但是卻無法訪問這個檔案,“看到摸不到”,嘿嘿。
優點:
1、可以使用所有的導航控制項 不需要寫任何代碼
2、網站地圖可以很方便的使用本地化資源(多種語言)
3、與RoleProvider結合,可以很方便的進行使用者的角色限制管理
4、不需要寫自訂的網站地圖提供者 使用預設的System.Web.XmlSiteMapProvider即可
缺點:
因為導航控制項放在主版頁面中,如果檔案太多,每次都要載入主版頁面,所以也必須重新載入網站地圖,會耗費資源?
不過這個例子中我沒有用到Menu控制項,樣本2中我寫了Menu。
原始碼:DemoSolution1.rar
二:ASP.NET網站導覽樣本2
這裡我沒有利用web.sitemap,而是直接根據前輩的思路,直接把檔案連結存在資料庫中,資料庫結構如下:
TreeView表中的這些欄位一般應該夠用了,呵呵,我也想不出來再加什麼欄位了,應該夠用了吧。
優點:
1、因為檔案連結資料都存在資料庫 不需要提供網站地圖
2、不需要寫自訂的網站地圖提供者 設定檔中也不需要生命siteMap節點(System.Web.XmlSiteMapProvider)
3、TreeView或Menu中的節點都是自己代碼實現,與RoleProvider結合,可以很方便的進行使用者的角色限制管理
缺點:
1、SiteMapPath控制項不能直接使用
2、因為導航控制項放在主版頁面中,如果檔案太多,每次都要載入主版頁面,從資料庫中取節點資料,比較浪費資源。可以考慮
使用資料緩衝,或者做成一個控制項,然後使用控制項緩衝(頁緩衝);
3、由於資料放在資料表中,需要專門的維護,也比較麻煩。
4、網站地圖檔存在資料庫中,不知道該怎麼使用本地化資源(多種語言)
原始碼:DemoSolution2.rar
三:ASP.NET網站導覽樣本3
這個其實是微軟MSDN上的一個例子,使用一般檔案(txt檔案)作為網站地圖。然後寫了自己的網站地圖提供者,繼承
自SiteMapProvider,不過這個例子中沒有提供角色管理的東西,我也還在繼續研究。
優點:
1、可以使用所有的導航控制項 不需要寫任何代碼
缺點:
1、網站地圖為txt檔案,不知道改怎麼使用本地化資源(多種語言)
2、如何與RoleProvider結合,進行使用者的角色限制管理?
3、由於使用自訂的網站地圖提供者 需要在設定檔中聲明siteMap節點(type="DemoSolution.SimpleTextSiteMapProvider")
4、我在測試時,發現每當在txt檔案中添加一個節點,就需要修改設定檔中的siteMap節點的siteMapFile屬性(如原來siteMapFile = "SimpleTextSiteMapProvider/SiteMap.txt",則要先重新命名一下SiteMap.txt,比如改為SiteMap1.txt,然後瀏覽頁面時就會找不到檔案,之後把名字再改回來就好了,為什麼呢)
原始碼:DemoSolution3.rar
三:ASP.NET網站導覽樣本4
這個也是微軟MSDN上的一個例子,跟樣本2一樣將檔案連結存在了資料庫中,我改寫了MSDN的例子,把資料存在了SQL
SERVER2005中了。然後寫了自己的網站地圖提供者,繼承自StaticSiteMapProvider,同樣這個例子中也沒有提
供角色管理的東西。
資料庫結構:
優點:
1、可以使用所有的導航控制項 不需要寫任何代碼
缺點:
1、網站地圖檔存在資料庫中,不知道該怎麼使用本地化資源(多種語言)
2、如何與RoleProvider結合,進行使用者的角色限制管理?
3、由於使用自訂的網站地圖提供者 需要在設定檔中聲明siteMap節點(type="DemoSolution.SqlSiteMapProvider")
4、我在測試時同樣也發現,每當在資料庫中添加一個節點,就需要修改設定檔中的siteMap節點的type屬性,比如原來
type="DemoSolution.SqlSiteMapProvider",我把它改為type="DemoSolution.SqlSiteMapProvider1",然後再
查看頁面就會報錯,再把名字改回來就好了,為什嗎???
5、我發現TreeView控制項只能顯示一個根節點,不知道是哪出錯了????
原始碼:DemoSolution4.rar
MSDN:
DataView 類
表示用於排序、篩選、搜尋、編輯和導航的 DataTable 的可綁定資料的自訂視圖。
DataView 的一個主要功能是允許在 Windows 表單和 Web Form上進行資料繫結。
另外,可自訂 DataView 來表示 DataTable 中資料的子集。此功能讓您擁有綁定到同一 DataTable、但顯示不同資料版本的兩個控制項。例如,一個控制項可能綁定到顯示表中所有行的 DataView,而另一個控制項可能配置為只顯示已從 DataTable 刪除的行。DataTable 也具有 DefaultView 屬性。它返回表的預設 DataView。例如,如果希望在表上建立自訂視圖,請在 DefaultView 返回的 DataView 上設定 RowFilter。
若要建立資料的篩選和排序視圖,請設定 RowFilter 和 Sort 屬性。然後,使用 Item 屬性返回單個 DataRowView。
還可使用 AddNew 和 Delete 方法從行的集合中進行添加和刪除。在使用這些方法時,可設定 RowStateFilter 屬性以便指定只有已被刪除的行或新行才可由 DataView 顯示。
注意:
如果不顯式指定 DataView 的排序條件,將按 DataView 的相應 DataRow 在 DataTable.RowsDataRowCollection 中的索引來對 DataView 中的 DataRowView 對象進行排序。
LINQ to DataSet 允許開發人員使用 LINQ 來建立對 DataSet 的複雜且功能強大的查詢。LINQ to DataSet 查詢返回 DataRow 對象的枚舉,但在綁定方案中不易使用。DataView 可以從 LINQ to DataSet 查詢建立,並具有該查詢的篩選和排序特徵。通過提供基於 LINQ 運算式的篩選和排序(可執行比基於字串的篩選和排序更複雜、功能更強大的篩選和排序操作),LINQ to DataSet 可擴充 DataView 的功能。有關更多資訊,請參見。