ASP.net Menu控制元件動態新增選單項實現許可權控制
阿新 • • 發佈:2019-01-07
對於動態選單生成,在很多具有許可權控制的專案中非常常見。最近遇到一個需求就是不同使用者具有不同許可權,該許可權是頁面級的,所以需要根據不同使用者的許可權情況動態生成選單項。
首先,我把選單項中的內容先儲存在一個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" };
}