65.9K
CodeProject 正在变化。 阅读更多。
Home

运行时根据用户权限将站点地图与菜单控件绑定

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2009年5月22日

CPOL

2分钟阅读

viewsIcon

48777

downloadIcon

1059

运行时根据用户权限将站点地图与菜单控件绑定

引言

本文将帮助您根据用户权限将 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.aspxSoftware.aspxHardware.aspx 的页面。

第二步

现在右键单击您的解决方案名称,然后单击“添加新项目”,并选择名为 Administrator.siteMap 的 siteMap。同样,再创建两个名为 User.siteMapDefault.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 的按钮,以及一个名为 strUserRolestring 变量。如果您单击 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 日:首次发布
在运行时根据用户权限将 Sitemaps 与 Menu 控件绑定 - CodeProject - 代码之家
© . All rights reserved.