1. 程式人生 > >ASP.net Menu控制元件動態新增選單項實現許可權控制

ASP.net Menu控制元件動態新增選單項實現許可權控制

      對於動態選單生成,在很多具有許可權控制的專案中非常常見。最近遇到一個需求就是不同使用者具有不同許可權,該許可權是頁面級的,所以需要根據不同使用者的許可權情況動態生成選單項。

       首先,我把選單項中的內容先儲存在一個XML裡面,在載入模板頁時只需根據查詢到的許可權集合找到相應選單項資訊,然後新增到選單項中就可以。

<?xml version="1.0" encoding="utf-8" ?>
<accessMenu>
  <rootItem key="A" value="A頁面">
    <childItem key="A01" value="~/About.aspx" text="頁面A01"></childItem>
    <childItem key="A02" value="~/About.aspx" text="頁面A02"></childItem>
  </rootItem>
  <rootItem key="B" value="B頁面">
    <childItem key="B01" value="~/About.aspx" text="頁面B01"></childItem>
    <childItem key="B02" value="~/About.aspx" text="頁面B02"></childItem>
    <childItem key="B03" value="~/About.aspx" text="頁面B03"></childItem>
  </rootItem>
  <rootItem key="C" value="C頁面">
    <childItem key="C01" value="~/About.aspx" text="頁面C01"></childItem>
    <childItem key="C02" value="~/About.aspx" text="頁面C02"></childItem>
    <childItem key="C03" value="~/About.aspx" text="頁面C03"></childItem>
    <childItem key="C04" value="~/About.aspx" text="頁面C04"></childItem>
  </rootItem>
  <rootItem key="D" value="D頁面">
    <childItem key="D01" value="~/About.aspx" text="頁面D01"></childItem>
  </rootItem>
</accessMenu>


其中 rootItem節點代表根選單項,value代表的顯示文字,childItem代表二級選單項,key代表頁面編號,資料庫中存放的是使用者與頁面的對應。value為選單項的導航連結,text為子選單項顯示文字。

然後寫了個XML讀取節點的類,只為演示,很不嚴謹。

public class XMLHelper
    {
        private string xmlPath = string.Empty;
        private XmlDocument doc = null;
        public XMLHelper(string path)
        {
            xmlPath = path;
            doc = new XmlDocument();
            doc.Load(path);
        }
        /// <summary>
        /// 獲取根選單項的文字
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetRootValue(string key)
        {
            XmlNode accnode = doc.SelectSingleNode("/*/rootItem[@key='" + key + "']");
            return accnode.Attributes["value"].Value;
        }
        /// <summary>
        /// 獲取子選單項的文字
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetChildItemText(string key)
        {
            XmlNode accnode = doc.SelectSingleNode("/*/rootItem/childItem[@key='" + key + "']");
            return accnode.Attributes["text"].Value;
        }
        /// <summary>
        /// 獲取子選單項的導航連結
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetChildItemValue(string key)
        {
            XmlNode accnode = doc.SelectSingleNode("/*/rootItem/childItem[@key='" + key + "']");
            return accnode.Attributes["value"].Value;
        }

當我們的模板頁載入的時候,從資料庫中讀取相應使用者的許可權,演示為手動生成一個集合。

 private IList<string> AccessList()
        {
            return new List<string> { "A01", "B02", "B03", "C01", "C04", "D01" };
        }

最後只需在 模板頁載入的時候處理一下就可以了。

protected void Page_Load(object sender, EventArgs e)
        {
            IList<string> access = AccessList();
            XMLHelper xml = new XMLHelper(Server.MapPath("~/Access.xml"));
            MenuItem aRoot = null;
            MenuItem bRoot = null;
            MenuItem cRoot = null;
            MenuItem dRoot = null;
            foreach (var item in access)
            {
                //獲取指定許可權頁面的根選單項
                string preString = item.Substring(0, 1);
                switch (preString)
                {
                    case "A":
                        if (aRoot == null)
                        {
                            aRoot = new MenuItem();
                            aRoot.Text = xml.GetRootValue(preString);
                        }
                        MenuItem achildItem = new MenuItem();
                        achildItem.Text = xml.GetChildItemText(item);
                        achildItem.NavigateUrl = xml.GetChildItemValue(item);
                        aRoot.ChildItems.Add(achildItem);
                        break;
                    case "B":
                        if (bRoot == null)
                        {
                            bRoot = new MenuItem();
                            bRoot.Text = xml.GetRootValue(preString);
                        }
                        MenuItem bchildItem = new MenuItem();
                        bchildItem.Text = xml.GetChildItemText(item);
                        bchildItem.NavigateUrl = xml.GetChildItemValue(item);
                        bRoot.ChildItems.Add(bchildItem);
                        break;
                    case "C":
                        if (cRoot == null)
                        {
                            cRoot = new MenuItem();
                            cRoot.Text = xml.GetRootValue(preString);
                        }
                        MenuItem cchildItem = new MenuItem();
                        cchildItem.Text = xml.GetChildItemText(item);
                        cchildItem.NavigateUrl = xml.GetChildItemValue(item);
                        cRoot.ChildItems.Add(cchildItem);
                        break;
                    case "D":
                        if (dRoot == null)
                        {
                            dRoot = new MenuItem();
                            dRoot.Text = xml.GetRootValue(preString);
                        }
                        MenuItem dchildItem = new MenuItem();
                        dchildItem.Text = xml.GetChildItemText(item);
                        dchildItem.NavigateUrl = xml.GetChildItemValue(item);
                        dRoot.ChildItems.Add(dchildItem);
                        break;
                    default:
                        break;
                }
            }
            if (aRoot != null)
                Menu1.Items.Add(aRoot);
            if (bRoot != null)
                Menu1.Items.Add(bRoot);
            if (cRoot != null)
                Menu1.Items.Add(cRoot);
            if (dRoot != null)
                Menu1.Items.Add(dRoot);
        }

 private IList<string> AccessList()
        {
            return new List<string> { "A01", "B02", "B03", "C01", "C04", "D01" };
        }