zoukankan      html  css  js  c++  java
  • 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 具体实现见adminmenu.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.XmlSiteMapProvider securityTrimmingEnabled="true" siteMapFile="Web.sitemap"/>             </providers>        

    </siteMap>

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

    3. Build menu

     用user control (adminmenu.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="~FormsfrmContent.aspx" description="待办事项"  targeturl="" />
          <siteMapNode title="我登记事件" url="~FormsfrmWaittingContent.aspx?TypeContent=MyReg" description="我登记事件"/>
          <siteMapNode title="出差授权" url="~FormsFrmAgentSet.aspx" description="出差授权"/>
    致您 - 狐貍啊 - 狐貍啊,安心吧      <siteMapNode title="计算器"  url="~FormsCalculator.htm" description="计算器"/>
          <siteMapNode title="万年历" url="~Formswnl.htm" description="万年历"/>
          <siteMapNode title="修改密码" url="~FormsFrmModuser.aspx" description="修改密码"/>
        </siteMapNode>
        <siteMapNode title="客户服务" img ="skins/2004/images/icon/sContacts.gif" menuIndex="2"  url ="~2.aspx">
          <siteMapNode title="客户服务登记" resourceKey="1824" url="~Formsform_all_flowmodel.aspx?appid=1026" description="客户服务登记"/>
          <siteMapNode title="客户服务跟踪" resourceKey="1811" url="~AppFormsCST_Issue_List.aspx" description="客户服务跟踪"/>
          <siteMapNode title="抱怨投诉登记" resourceKey="1825"  url="~Formsform_all_flowmodel.aspx?AppID=320" description="抱怨投诉登记"/>
          <siteMapNode title="抱怨投诉查询" resourceKey="207"  url="~AppFormsfrm_BYTS_Query.aspx" description="抱怨投诉查询"/>
          <siteMapNode title="材料管理" resourceKey="1845" url="~AppFormsfrmMaterial.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

  • 相关阅读:
    微信小程序入门
    rem js相关
    移动端rem.js使用方法
    手机访问PC网站自动跳转到手机版
    当 return 遇到 try
    Ubuntu apt 使用代理
    shell 十进制数字转十六进制字符串并将结果保存到变量
    (二)一起学 Java Collections Framework 源码之 AbstractCollection
    (一)一起学 Java Collections Framework 源码之 概述
    解决 meld 出现 locale.setlocale(locale.LC_ALL,'') 失败的问题
  • 原文地址:https://www.cnblogs.com/happylyyer/p/4469421.html
Copyright © 2011-2022 走看看