角色与网站地图的结合

1、准在母版页上加入导航菜单功能,数据源来自站点地图。web.sitemap内容大致如下:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization ="true" >
  <siteMapNode title="主页" url="~/Default.aspx">
    <siteMapNode title="文章" url="~/ShowCategories.aspx">
      <siteMapNode title="浏览文章" url="~/BrowseArticles.aspx" />
    </siteMapNode>
    <siteMapNode title="购物" url="~/ShowDepartments.aspx">
      <siteMapNode title="购物卡" url="~/ShoppingCart.aspx" />
      <siteMapNode title="订单记录" url="~/OrderHistory.aspx" />
      <siteMapNode title="产品浏览" url="~/BrowseProducts.aspx">
      </siteMapNode>
    </siteMapNode>
    <siteMapNode title="论坛" url="~/ShowForums.aspx">
      <siteMapNode title="Show Thread" url="~/ShowThread.aspx" />
    </siteMapNode>
    <siteMapNode title="关于" url="~/About.aspx" />
    <siteMapNode title="联系" url="~/Contact.aspx" />
    <siteMapNode title="管理员" url="~/Admin/Default.aspx">
      <siteMapNode title="管理用户" url="~/Admin/ManageUsers.aspx" >
        <siteMapNode title="编辑用户" url="~/Admin/EditUser.aspx" />
      </siteMapNode>
      <siteMapNode title="文章管理" url="~/Admin/ManageArticles.aspx" >
        <siteMapNode title="增加/修改 文章" url="~/Admin/AddEditArticle.aspx" />
      </siteMapNode>
    </siteMapNode>
  </siteMapNode>
</siteMap>

为什么主页节点会作为根节点,而不是同其他节点在同一层次上?实际上这是可选的,我们希望SiteMapPath控件在页面路径的最前端始终显示主页链接,所以将主页节点作为根节点。

网站根目录下新建母版页template.master,源视图代码:

<form id="form1" runat="server">
          <table>
            <tr>
                <td colspan="2" width="60%" bgcolor="#3399FF">
                    &nbsp;</td>
                <td>
                    <asp:LoginView ID="LoginView1" runat="server">
                    <AnonymousTemplate>
                        <asp:Login ID="Login1" runat="server">
                        </asp:Login>
                    </AnonymousTemplate>
                    <LoggedInTemplate>
                        <asp:LoginName ID="LoginName1" FormatString="欢迎您,{0}!" runat="server" /><br />
                        <asp:HyperLink ID="lnkProfile" NavigateUrl="~/EditProfile.aspx" runat="server">编辑用户资料</asp:HyperLink>
                        <br/>
                        <asp:LoginStatus runat="server">
                        </asp:LoginStatus>
                    </LoggedInTemplate>
                    </asp:LoginView>
                </td>
            </tr>
            <tr>
                <td width="20%" bgcolor="Lime">
                    &nbsp;</td>
                <td>
                    <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" 
                        StaticSubMenuIndent=""></asp:Menu>
                        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        
                        </asp:ContentPlaceHolder>
                </td>
                <td width="20%" bgcolor="#3366FF">
                    &nbsp;</td>
            </tr>
        </table>
        <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
    </form>

 

对应的设计视图:

image

注意:这里用了LoginView控件来决定匿名用户与登录用户呈现不同的部分。(该控件的用法请参考:http://www.cnblogs.com/netxiaochong/archive/2011/12/25/2301024.html)

menu控件的属性如下设置:

<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1"
                        StaticSubMenuIndent="" Orientation="Horizontal" StaticDisplayLevels="2"></asp:Menu>

新建Default.aspx页面(若项目已有则删除后重建),并应用母版页template.master,浏览该页面,看效果:

image

匿名用户访问此页面的时候,以及非管理员角色(Administrators)的注册用户都是不能见到【管理员】菜单项的。

我们对web.sitemap进行相应的设置。

<siteMapNode title="管理员" url="~/Admin/Default.aspx" roles="Administrators">

还必须为网站地图注册一个新的提供程序(在web.config的<siteMap>中),设置其为securityTrimmingEnabled属性为true

image

提示:<siteMap>节点 位置放在<membership>之后,可能才正常!

 

再次运行default.aspx页面,然后用[张鲁鲁]登录系统,因为该用户属于Administrators角色,看看前后导航菜单的区别。

image

posted @ 2011-12-28 11:45  net小虫  阅读(216)  评论(0编辑  收藏  举报