在这里,你首先得到根结点中的子结点的总数。然后,你循环遍历根结点的ChildNodes集合。在每一次遍历中,你都会创建一个新的TreeNode类的实例并且在它的构造器中指定它的标题和url。然后,你把这个TreeNode添加到TreeView的Nodes集合中。然后,你检查是否当前SiteMapNode有任何子结点。如果有,你就对之进行遍历,重复TreeNode创建过程。注意,这一次你把新的TreeNodes添加到当前TreeNode对象的ChildNodes集合中。
注意,因为你知道只存在两级的嵌套,所以你在循环中使用了2。为了使得你的逻辑更具有一般性,你可以使用递归来填充TreeView。
运行Web表单,那么你将再次看到类似于图8所示的内容。
六、 使用安全整修
经常情况下,网站都要实现基于角色的安全模式。例如,你可以在你的应用程序中具有不同的角色,例如系统管理员,产品测试员和服务测试员。在这样的情况中,你经常需要控制显示给用户的站点导航链接。例如,如果当前登录的用户属于产品测试员角色,那么你可能仅想显示与产品相联系的链接,而隐藏任何其它链接。一种处理角色的方法是使用手工编码,但是,它要求以编程方式实现所有的授权逻辑。幸好,站点地图文件和SiteMap数据源控件一起提供了一种称为安全整修的特征来帮助你。
为了测试安全整修,你需要启动你的网站的会员和角色特征。打开web.config文件并且在其中加入下列标记:
| <authentication mode="Forms" /> <authorization> <deny users="?"></deny> </authorization> |
在此,你已经把认证模式设置为Forms。你还可以设置授权规则,这样以来匿名的用户都会被禁止存取此网站。然后,你需要启动角色管理特征—通过把下列标志添加到web.config文件中:
| <roleManager enabled="true" /> |
然后,从VS.NET菜单下选择“WebSite>ASP.NET Configuration”以打开Web站点管理工具。使用这个工具来添加两个角色:ProductTesters和ServiceTesters(参考图9)。当一个属于ProductTesters角色的用户签入时,你只想实现把与产品相关的链接显示在导航TreeView控件中。同样,当一个属于ServiceTesters角色的用户签入时,应该只在TreeView中显示与服务相关的链接。
![]() 图9:使用Web站点管理工具添加角色 |
使用Web站点管理工具创建两个用户,分别叫user1和user2。把user1添加到ProductTesters角色,把user2添加到ServiceTesters角色(见图10)。
![]() 图10:使用Web站点管理工具创建用户 |
注意:默认地,用户和角色信息被存储在你的网站的App_Data文件夹下的ASPNETDB数据库中。这个数据库是由ASP.NET自动创建的,如果它不存在的话。
现在,把一个新的站点地图文件SecurityTrimming.sitemap添加到网站并且输入下列标记:
| <?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="Home" description="My Web Site"> <siteMapNode title="Products" roles="ProductTesters"> <siteMapNode url="~/products/product1.aspx" title="First Product" /> <siteMapNode url="~/products/product2.aspx" title="Second Product" /> </siteMapNode> <siteMapNode title="Services" roles="ServiceTesters"> <siteMapNode url="~/services/service1.aspx" title="First Service" /> <siteMapNode url="~/services/service2.aspx" title="Second Service" /> </siteMapNode> <siteMapNode url="contact.aspx" title="Contact Us" /> </siteMapNode> </siteMap> |
这里的大多数标记与在web.sitemap文件中的相同。然而,这里有一个重要的属性添加到了Products和Services—siteMapNodes:roles。这个roles属性指定能够存取这个结点及其子结点的角色。因为与产品相联系的链接仅显示给属于ProductTesters角色的用户,你要把Products siteMapNode的roles属性设置为ProductTesters。遵循相同的道理,你要把Services siteMapNode的roles属性设置为ServiceTesters。不具有指定的roles属性的siteMapNodes对于所有用户都可存取。另外,还应注意,Products和Services结点不再具有指定的URL属性。
现在,你需要配置站点地图提供者并且启动安全整修以便SiteMap数据源控件能够按照你的要求行动。把下列标记添加到web.config文件中:
| <siteMap defaultProvider="myprovider" enabled="true"> <providers> <add name="myprovider" type="System.Web.XmlSiteMapProvider " siteMapFile="SecurityTrimming.sitemap" securityTrimmingEnabled="true" /> </providers> |
在此,你添加了<siteMap>节并且指定一个指向SecurityTrimming.sitemap文件的提供者。注意,这里的securityTrimmingEnabled属性被设置为true以支持安全整修。在你配置完<siteMap>节后,这个SiteMap数据源控件自动地从这个节中“拾取”这些设置。
把一个称为Login.aspx的新的web表单添加到网站上。然后,把一个Login控件拖动到它上面并且设置它的DestinationPageUrl属性为“~/SiteMapDataSourceDemo.aspx”。注意,你在之前已经开发了SiteMapDataSourceDemo.aspx。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!






