ASP.NET進階權限控管-Part 2 登入結合資料庫、樹狀結構維護

繼承上一篇的願景【ASP.NET進階權限控管-Part 1 願景】,接著這篇先來講講一些基本的部分。

首先是【登入結合自己的資料庫】,以及【TreeView樹狀結構結合資料庫】這兩個部分,由於小喵以前已經有文章說明了這兩個部分,所以在這邊也不贅述。請看考以下的這兩篇。

瞭解了上面的這些部分候,接著就是如何維護樹狀結構,看一下維護運作的畫面先

繼承上一篇的願景【ASP.NET進階權限控管-Part 1 願景】,接著這篇先來講講一些基本的部分。

首先是【登入結合自己的資料庫】,以及【TreeView樹狀結構結合資料庫】這兩個部分,由於小喵以前已經有文章說明了這兩個部分,所以在這邊也不贅述。請看考以下的這兩篇。

  1. 登入結合自己的資料庫
  2. TreeView樹狀結構結合資料庫

瞭解了上面的這些部分候,接著就是如何維護樹狀結構,看一下維護運作的畫面先

menu002

畫面分為左右兩區

左邊的【畫面選擇】會出現目前全部的樹狀結構,而右邊的【畫面設定】則是編輯區,用以新增、修改、刪除設定。另外在右邊裡面還有個相關aspx設定,用以設定哪些aspx歸屬於這個節點管理,未來系統會在運行的時候,自動抓取目前的畫面名稱,此時透過這個設定,找出要對應哪個節點代號,進而找出該節點的權限。

 

再來就來看看如何設計這樣的畫面與程式。

資料庫設計

首先是資料庫欄位的設計,樹狀結構的資料庫欄位在TreeView樹狀結構結合資料庫裡面已經有,再拿出來複習一下

資料表名稱:TCATMenu

再來就是設計一個節點對畫面的資料表,格式如下:

資料表名稱:TCATMenuAspx

menu003

 

畫面維護

 

 

畫面維護上,TreeView產生過程稍微特別一點,小喵大致說明一下:

首先是在產生TreeView的遞迴程式方面,由於我們這次並非要產生一個具備超連結的TreeView,相對的,我們是要當點選TreeView的某個節點時,傳出該節點的NodeId,因此Node的NavigateUrl與Target就不給予指定。然後就可以在TreeView的事件TreeView1_SelectedNodeChanged去取得該Node的NodeId(Me.TreeView1.SelectedValue),並且取得該NodeId的相關資料。

TreeView遞迴產生的部分請參考小喵以前的文章【ASP.NET 2.0 使用資料表動態產生TreeView的樹狀結構

AddNote的部分修改如下


    Function AddNodes(ByRef Dt As DataTable, ByRef tNode As TreeNode, ByVal PId As Integer) As String
        '******** 遞迴增加樹結構節點 ********
        Try

            '定義DataRow承接DataTable篩選的結果
            Dim rows() As DataRow
            '定義篩選的條件
            Dim filterExpr As String
            filterExpr = "ParentId = " & PId
            '資料篩選並把結果傳入Rows
            rows = Dt.Select(filterExpr, "Sort")

            '如果篩選結果有資料
            If rows.GetUpperBound(0) >= 0 Then

                Dim row As DataRow
                Dim tmpNodeId As Long
                Dim tmpsText As String
                Dim tmpsValue As String
                Dim tmpsUrl As String
                Dim tmpsTarget As String
                Dim NewNode As TreeNode
                Dim rc As String

                '逐筆取出篩選後資料

                Dim tt As String = ""
                For Each row In rows
                    '放入相關變數中
                    tmpNodeId = row("NodeId")
                    tmpsText = row("sText") + "(" + row("NodeId").ToString + ")"
                    tmpsValue = row("sValue")
                    tmpsTarget = row("sTarget")
                    tmpsUrl = row("sURL")

                    '實體化新節點
                    NewNode = New TreeNode
                    '設定節點各屬性
                    NewNode.Text = tmpsText
                    NewNode.Value = tmpNodeId
                    'NewNode.NavigateUrl = tmpsUrl
                    'NewNode.Target = tmpsTarget
                    'If tmpsUrl = "" Then
                    '    NewNode.SelectAction = TreeNodeSelectAction.None
                    'End If
                    '將節點加入Tree中
                    If Me.RunNodeText <> "" Then
                        If tmpsText = Me.RunNodeText Then
                            NewNode.Select()
                            Me.RunNodeText = ""
                        End If
                    End If
                    tNode.ChildNodes.Add(NewNode)

                    '呼叫遞回取得子節點
                    rc = AddNodes(Dt, NewNode, tmpNodeId)

                Next
            End If
            '傳回成功訊息
            AddNodes = "Success"

        Catch ex As Exception
            lblErrMsg.Text = ex.Message
            AddNodes = "False"

        End Try
    End Function

資料維護的部分其實不會太複雜,這部分小喵就沒把相關程式碼附上了

節點畫面對照

另外就是,節點與畫面的對照,在TreeView的一個節點,他可能會用好幾個畫面才處理這個功能。因此NodeId與Aspx是一對多的關係。而畫面名稱可以用Page.ToString()取得,不過取得的名稱有點累贅,比如說,假設我的系統是http://www.blueshop.com.tw/PCAT

而有個ASPX他的是在我專案下Test資料夾下的PCATTest.aspx(http://www.blueshop.com.tw/PCAT/Test/PCATTest.aspx)那麼取得的名子將是【aspx_test_pcattest_aspx】其中包含了前面固定會出現的aspx_,其他就是資料夾、檔案名稱,用_間隔開來。因此,小喵會把設定在TreeView的網址Test/PCATTest.aspx處理成test_pcattest_aspx這樣方便未來在PageBase裡面可以自動抓畫面名稱來判斷。處理的Function如下

 


Aspxs = Replace(Me.txtAspx.Text.ToLower, "/", "_")
 Aspxs = Replace(Aspxs, ".", "_")

處理前:Test/PCATTest.aspx

處理後:test_pcattest_aspx

那麼在PageBase裡面只要用以下取得的拿來當作查詢條件就可以了

 


Dim AspxName As String = Mid(Me.Page.ToString, 5, Len(Me.Page.ToString) - 4)

 

以上就是有關畫面樹狀結構設定、樹狀結構節點與畫面名稱對照設定的相關介紹。

接著下一篇將會介紹【ASP.NET進階權限控管-Part 3 角色管理與角色使用者維護


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat