站点导航的用户控制的XML菜单

分享于 

5分钟阅读

Web开发

  繁體

DBDrivenMenu

介绍

首先,非常感谢对CodeProject的第一篇文章做出了很好的响应。 在本文中,我将说明如何在整数上使用位操作,以帮助我们制作一个冷却的菜单。 一如既往,我的座右铭是最小编程工作。

背景

你需要对. NET CLR进行良好理解,以更好地理解本文,因为这个概念依赖于它。

首先让我简要介绍一下按位 '&' 操作符的用法。 这里运算符用于检查整数值中的位的状态。 请注意以下关于 '&'的信息:

  • 0 & 1 = 0
  • 1 & 0 = 0
  • 0 & 0 = 0
  • 1 & 1 = 1

我不会把整数转换为比特的细节。 但是请注意以下属性:

10111011 & 00100000 = 00100000

I.e,187 & 32 = 32

使用代码

我们需要向代码中添加 SQL,因为在 C# 中对整数应用'&'是非法的。 我们使用 Microsoft.SqlServer.Server 命名空间来实现这一点。 为了构建这个菜单,我们为每个项目分配了一个分数,以为单位,每个项目为:

<?xmlversion="1.0"?><SiteMenu><MenuItemTitle="A"URL="Page1.aspx"Value="1"><MenuItemTitle="A.1"URL="Page1-1.aspx"Value="2"/><MenuItemTitle="A.2"URL="Page1-2.aspx"Value="4"/></MenuItem><MenuItemTitle="B"URL="Page2.aspx"Value="8"><MenuItemTitle="B.1"URL="Page2-1.aspx"Value="16"/><MenuItemTitle="B.2"URL="Page2-2.aspx"Value="32"/></MenuItem><MenuItemTitle="C"URL="Page3.aspx"Value="64"><MenuItemTitle="C.1"URL="Page3-1.aspx"Value="128"/><MenuItemTitle="C.2"URL="Page3-2.aspx"Value="256"><MenuItemTitle="C.2.1"URL="Page3-2-1.aspx"Value="512"/><MenuItemTitle="C.2.2"URL="Page3-2-2.aspx"Value="1024"><MenuItemTitle="C.2.2.1"URL="Page3-2-2.aspx"Value="2048"/></MenuItem></MenuItem></MenuItem></SiteMenu>

我们还为每个用户分配一个分数,这些用户计算的是我们希望用户看到的菜单项的总和。 说,我们希望用户只能看到一个带有所有子项的主菜单,然后分数为 1 +2+4 = 7. 注意,如果要使用它的任何子菜单,需要添加主菜单分数 换句话说,。B 或者C的分数。

现在,我们跳到最后一个关键部分,即使用菜单值执行'&'操作的CLR代码,看看用户是否有资格。

[Microsoft.SqlServer.Server.SqlFunction()]privatebool Addable(int score, int valueToCheck)
{
 return ((score & valueToCheck) == valueToCheck);
}

现在,我们只需要记录每个用户的分数,并获得需要的XML数据源绑定到菜单或者树。 项的每个菜单值都被检查以获得它的'&'能力与总分数,以查看它是否符合用户标准的菜单。

if (score!= 0)
{
 datasetReadXML = new DataSet();
 datasetMenuItems = new DataSet();
 xdsMenuData = new XmlDataSource();
 ///Necessary for Displaying Updated Values. xdsMenuData.EnableCaching = false;
 xdsMenuData.EnableViewState = false;
 ///Read XML and prepare a menu data holder. datasetReadXML.ReadXml(pathToXML);
 datasetMenuItems = datasetReadXML.Clone();
 ///Get required menu items in the holder.foreach (DataRow drWorker in datasetReadXML.Tables[0].Rows)
 if (Addable(score, Convert.ToInt32(drWorker["Value"])))
 datasetMenuItems.Tables[0].ImportRow(drWorker);
 ///Make a StringWriter to read XML. stringWriter = new System.IO.StringWriter();
 datasetMenuItems.WriteXml(stringWriter, XmlWriteMode.IgnoreSchema);
 ///Populate XMLDataSource with XML. xdsMenuData.Data = stringWriter.ToString();
 ///Bind menu or tree. TreeMenu.DataSource = xdsMenuData;
 Menu.DataSource = xdsMenuData;
 this.DataBind();
}

我使用了XML来跟踪用户的分数。 但是,你可以使用自己的数据库选择来执行相同的操作。 你所需要的只是得分。 附加的代码是自解释的。

Points of Interest

请记住,将XML数据源的EnableCachingEnableViewState 属性设置为 false 获取更新后的值。 我看到很多人在不同的论坛上发疯。


相关文章