ASP.NET支持用Menu显示web.sitemap中定义好的网站链接

在页面上添加一个SiteMapDataSource,  SiteMapDataSource会使用web.config中指定的default siteMap provider读取web.sitemap的内容.
再把SiteMapDataSource作为数据源指定给Menu控件就搞定了.整个过程不用写一行代码

ASP.NET还提供了对权限控制和Localization的支持,
在web.config中设定sitemap provider是否对siteMapNode进行过滤:
<siteMap defaultProvider="SecuritySiteMap" enabled="true">
            <providers>
                <add name="SecuritySiteMap" type="System.Web.XmlSiteMapProvider, System.Web"securityTrimmingEnabled="true" siteMapFile="Web.sitemap"/>
            </providers>
</siteMap>
securityTrimmingEnabled="true"说明对siteMapNode进行过滤

再在web.sitemap中对siteMapNode, Localization和权限进行设定:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap enableLocalization="true">
    <siteMapNode url="~/default.aspx" title="$Resources: SiteMap, default" roles="admins"securityTrimmingEnabled="true">
        <siteMapNode url="~/admin/user.aspx" title="$Resources: SiteMap, user"   roles="admins" securityTrimmingEnabled="ture"/>
    </siteMapNode>
</siteMap>

注意别忘记了enableLocalization="true",否则将什么也不显示,也不会报错
title="$Resources: SiteMap, default" 从global resource文件 SiteMap.resx中读取资源"default".
roles="admins" 说明此节点只对admins可见

BlogEngine 提供了自己的Menu和web.sitemap机制, 支持权限控制和Localization
具体实现见admin\menu.ascx

1.在web.sitemap中设置节点对应的角色:
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
    <siteMapNode url="default.aspx" title="Blog Engine"  description="" roles="administrators, editors">
        <siteMapNode url="~/admin/Pages/Add_entry.aspx" title="add_entry"  description="" roles="administrators, editors"/>
        <siteMapNode url="~/admin/Pages/Blogroll.aspx" title="blogroll"  description="" roles="administrators, editors"/>
        <siteMapNode url="~/admin/Extension Manager/Default.aspx" title="Extensions"  description="" roles="administrators"/>
    </siteMapNode>
</siteMap>
注意title指定的是global资源名.

2. 使用两套PageSiteMap, 一个用于匿名用户.一个用于已登录用户(赞!)         
<siteMap defaultProvider="PageSiteMap" enabled="true">
            <providers>
                <add name="PageSiteMap" type="BlogEngine.Core.Web.Controls.PageSiteMap, BlogEngine.Core"/>
                <add name="SecuritySiteMap"  type="System.Web.XmlSiteMapProvidersecurityTrimmingEnabled="true" siteMapFile="Web.sitemap"/>
            </providers>
        </siteMap>

PageSiteMap并没有从xml文件中读取设置.而是动态生成SiteMapNode(赞!)
SecuritySiteMap从xml文件中读取内容,securityTrimmingEnabled=true表明根据权限过滤节点

3. Build menu
用user control (admin\menu.ascx)来显示web.sitemap中的设定
private void BindMenu()
    {
        SiteMapNode root = SiteMap.Providers["SecuritySiteMap"].RootNode;
        if (root != null)
        {
            foreach (SiteMapNode adminNode in root.ChildNodes)
            {
                if (adminNode.IsAccessibleToUser(HttpContext.Current))
                {
                    if (!Request.RawUrl.ToUpperInvariant().Contains("/ADMIN/") && (adminNode.Url.Contains("xmanager") || adminNode.Url.Contains("PingServices")))
                        continue;
                    HtmlAnchor a = new HtmlAnchor();
                    a.HRef = adminNode.Url;
                    a.InnerHtml = "<span>" + Translate(adminNode.Title) + "</span>";//"<span>" + Translate(info.Name.Replace(".aspx", string.Empty)) + "</span>";
                    if (Request.RawUrl.EndsWith(adminNode.Url, StringComparison.OrdinalIgnoreCase))
                        a.Attributes["class"] = "current";
                    HtmlGenericControl li = new HtmlGenericControl("li");
                    li.Controls.Add(a);
                    ulMenu.Controls.Add(li);
                }
            }
        }
}
注意web.sitemap中节点的Title只是字符串资源的名称.显示时会根据当前Culture抓取相应的资源 

 

 

 

 

Web.SitMap 是 VS2005中一个非常重要的特性. 可以用于菜单等应用,但企业的应用中经常需要控制到 菜单的 target ,菜单的权限等. 

通过扩展一些自定义属性可以实现(此方法已经在E8.Net 2.0 工作流应用架构中实现)

sitmap 范例:

  < siteMapNode title = " 主页 "  url = " Newmain.aspx "  target = " _parent "  disenable = " true "  startIndex = " 1 "   AdminIndex = " 9 " >
    
< siteMapNode title = " 我的桌面 "  img = " skins/2004/images/icon/desktop.gif "   menuIndex = " 1 "   url  = " ~\1.aspx " >
      
< siteMapNode title = " 待办事项 "  url = " ~\Forms\frmContent.aspx "  description = " 待办事项 "   targeturl = ""   />
      
< siteMapNode title = " 我登记事件 "  url = " ~\Forms\frmWaittingContent.aspx?TypeContent=MyReg "  description = " 我登记事件 " />
      
< siteMapNode title = " 出差授权 "  url = " ~\Forms\FrmAgentSet.aspx "  description = " 出差授权 " />
致您 - 狐貍啊 - 狐貍啊,安心吧      
< siteMapNode title = " 计算器 "   url = " ~\Forms\Calculator.htm "  description = " 计算器 " />
      
< siteMapNode title = " 万年历 "  url = " ~\Forms\wnl.htm "  description = " 万年历 " />
      
< siteMapNode title = " 修改密码 "  url = " ~\Forms\FrmModuser.aspx "  description = " 修改密码 " />
    
</ siteMapNode >
    
< siteMapNode title = " 客户服务 "  img  = " skins/2004/images/icon/sContacts.gif "  menuIndex = " 2 "   url  = " ~\2.aspx " >
      
< siteMapNode title = " 客户服务登记 "  resourceKey = " 1824 "  url = " ~\Forms\form_all_flowmodel.aspx?appid=1026 "  description = " 客户服务登记 " />
      
< siteMapNode title = " 客户服务跟踪 "  resourceKey = " 1811 "  url = " ~\AppForms\CST_Issue_List.aspx "  description = " 客户服务跟踪 " />
      
< siteMapNode title = " 抱怨投诉登记 "  resourceKey = " 1825 "   url = " ~\Forms\form_all_flowmodel.aspx?AppID=320 "  description = " 抱怨投诉登记 " />
      
< siteMapNode title = " 抱怨投诉查询 "  resourceKey = " 207 "   url = " ~\AppForms\frm_BYTS_Query.aspx "  description = " 抱怨投诉查询 " />
      
< siteMapNode title = " 材料管理 "  resourceKey = " 1845 "  url = " ~\AppForms\frmMaterial.aspx "  description = " 材料管理 " />
    
</ siteMapNode >
..
  
</ siteMapNode >
</ siteMap >


可以看到 这个sitmap中 有 target  diseable resourcekey ...等扩展属性 来实现菜单权限控制 及控制方式等

实现代码:

  protected   void  TreeView1_TreeNodeDataBound( object  sender, TreeNodeEventArgs e)
        
{
            
//节点
            SiteMapNode smn = (SiteMapNode)e.Node.DataItem;
            
string strOpID = smn.ResourceKey;
            Epower.ITSM.SqlDAL.UIMethod ui 
= new Epower.ITSM.SqlDAL.UIMethod();

            
string strTarget = smn["target"];

            
if (strTarget != "")
            
{
                e.Node.Target 
= strTarget;
            }



            
if (strOpID != null && strOpID.Length > 0)
                ui.CheckNodeRight(strOpID, e.Node, (Hashtable)Session[
"UserAllRights"],TreeView1);
            
            
        }




 
/// <summary>
        
/// 如果为false,表示设置为没有权限的菜单移除
        
/// </summary>
        
/// <param name="strID"></param>
        
/// <param name="item"></param>

         public   void  CheckNodeRight( string  strID, TreeNode item, Hashtable htAllRights, TreeView TreeView1)
        
{
            
long OperatorID = 0;
            
try
            
{
                OperatorID 
= long.Parse(strID);
            }

            
catch { }

            
if (OperatorID == 0)
                
return;

            RightEntity re 
= (RightEntity)htAllRights[OperatorID];
            
if (re == null)
                
return;
            
else
            
{
                
if (re.CanRead == false)
                
{
                    
//移除菜单项
                    TreeNode pitem = item.Parent;
                    
if (pitem != null)
                    
{
                        pitem.ChildNodes.Remove(item);
                    }

                    
else
                    
{
                        TreeView1.Nodes.Remove(item);
                    }

                }

            }

        }




依据同样的方法,可以扩展更多的自定义属性,达到对sitMap 非常丰富的控制和展示逻辑. 
E8.Net 工作流 开源架构 提供了全部实现的源码, 2.0下所有应用系统菜单(OUTLOOK风格),实现来自 web.sitMap

你可能感兴趣的:(ASP.NET支持用Menu显示web.sitemap中定义好的网站链接)