运行时根据用户权限将站点地图与菜单控件绑定
运行时根据用户权限将站点地图与菜单控件绑定
引言
本文将帮助您根据用户权限将 Menu 控件(在 Navigation 选项卡下)与不同的 siteMap 绑定。例如,如果用户权限是管理员,则会显示不同的菜单;如果用户权限是普通用户,则会显示不同的菜单。它将根据用户权限在运行时将菜单控件与 siteMap 绑定。
背景
对于在网站中从一个页面导航到另一个页面,siteMap 和 Menu 控件起着重要作用。我们可以在 siteMap 中定义页面 URL,并将其与菜单控件绑定,之后就可以轻松地从一个页面导航到另一个页面。
Using the Code
这里有一个示例,演示了如何根据用户权限从一个页面导航到另一个页面。
步骤 1
创建一个名为 Home.aspx 的页面,或者您应该创建一个母版页,并将 Menu 控件拖到母版页上,因为每当您在任何页面中添加母版页时,该菜单控件将自动添加到该页面。但在这里,我给您一个关于如何创建 siteMap 并将该 siteMap 与 Menu 控件绑定的想法。将 Menu 控件拖到您的 Home.aspx 页面上,右键单击 Menu1,选择属性,并将 Orientation 更改为 vertical to Horizontal 或您想要的任何其他方向。现在创建三个名为 CreateUser.aspx、Software.aspx 和 Hardware.aspx 的页面。
第二步
现在右键单击您的解决方案名称,然后单击“添加新项目”,并选择名为 Administrator.siteMap 的 siteMap。同样,再创建两个名为 User.siteMap 和 Default.siteMap 的 siteMap。现在根据用户权限在 siteMap 中定义所有菜单项。
对于 Administrator.siteMap
<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
<siteMapNode url="~/Home.aspx" title="Home" description="HomePage"/>
<siteMapNode url="~/CreateUser.aspx" title="CreateUser" description="CreateUser" />
<siteMapNode url="" title="Products" description="Products" >
<siteMapNode url="~/Software.aspx" title="Software" description="Software" />
<siteMapNode url="Hardware.aspx" title="Hardware" description="Hardware" />
</siteMapNode>
</siteMap>
对于 User.siteMap
<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
<siteMapNode url="~/Home.aspx" title="Home" description="HomePage"/>
<siteMapNode url="" title="Products" description="Products" >
<siteMapNode url="~/Software.aspx" title="Software" description="Software" />
<siteMapNode url="Hardware.aspx" title="Hardware" description="Hardware" />
</siteMapNode>
</siteMap>
现在创建一个第三个 siteMap Default.siteMap,就像我上面已经创建的 user.siteMap 一样。
步骤 3
转到 Home.aspx 页面,在源代码中将 DataBindings 元素添加到 asp:menu
元素内,如下所述
<asp:Menu ID="Menu1" runat="server" Orientation="Horizontal"
Width="383px" style="z-index: 100; left: 203px; position: absolute;
top: 57px" BackColor="#FFFBD6" Font-Bold="True" Font-Names="Verdana"
Font-Size="Medium" ForeColor="#990000" StaticSubMenuIndent="10px">
<DataBindings>
<asp:MenuItemBinding DataMember="siteMapNode"
NavigateUrlField="url" TextField="title" />
</DataBindings>
<StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<DynamicHoverStyle BackColor="#990000" ForeColor="White" />
<DynamicMenuStyle BackColor="#FFFBD6" />
<StaticSelectedStyle BackColor="#FFCC66" />
<DynamicSelectedStyle BackColor="#FFCC66" />
<DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<StaticHoverStyle BackColor="#990000" ForeColor="White" />
</asp:Menu>
步骤 4
现在转到 Home.aspx.cs 页面并创建一个名为 GetDataSource()
的函数
XmlDataSource GetDataSource(string UserRole, string ServerPath)
{
XmlDataSource oXmlDataSource = new XmlDataSource();
oXmlDataSource.XPath = "siteMap/siteMapNode";
switch (UserRole)
{
case "Administrator":
oXmlDataSource.DataFile = ServerPath + @"/App_Data/Administrator.sitemap";
break;
case "User":
oXmlDataSource.DataFile = ServerPath + @"/App_Data/User.sitemap";
break;
default:
oXmlDataSource.DataFile = ServerPath + @"/App_Data/Default.sitemap";
break;
}
oXmlDataSource.DataBind();
return oXmlDataSource;
}
步骤 5
在 Home.aspx.cs 中,将 DataSource
分配给 Menu1
并绑定 Menu1
。
protected void Page_Load(object sender, EventArgs e)
{
Menu1.DataSource = GetDataSource(strUserRole, Server.MapPath("~"));
Menu1.DataBind();
}
现在您的 Menu 已与 siteMap 绑定。
步骤 6
注意:为了便于理解,我使用了两个名为 AdminRole 和 UserRole 的按钮,以及一个名为 strUserRole
的 string
变量。如果您单击 AdminRole 按钮,您将获得 Administrator.siteMap,因为我传递了“Administrator”作为硬编码,或者如果您单击 UserRole,您将获得 User.siteMap。在这里,我无法根据角色进行描述,因为我没有从任何地方记录或获取用户权限。
在按钮事件中,我们需要再次绑定 Menu1
全局定义 strUserRole
,如下所示
string strUserRole = string.Empty;
并在按钮事件内部
protected void btnAdmin_Click(object sender, EventArgs e)
{
strUserRole = "Administrator";
Menu1.DataSource = GetDataSource(strUserRole, Server.MapPath("~"));
Menu1.DataBind();
}
protected void btnUser_Click(object sender, EventArgs e)
{
strUserRole = "User";
Menu1.DataSource = GetDataSource(strUserRole, Server.MapPath("~"));
Menu1.DataBind();
}
历史
- 2009 年 5 月 22 日:首次发布