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.XmlSiteMapProvider securityTrimmingEnabled="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

时间: 2024-10-07 04:17:50

ASP.NET支持用Menu显示web.sitemap中定义好的网站链接 【转载】的相关文章

WCF项目问题2-无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。

无法激活服务,因为它需要 ASP.NET 兼容性.没有未此应用程序启用 ASP.NET 兼容性.请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值. 在web.config中添加 aspNetCompatibilityEnabled="true"属性即可,如下: <servi

phpmyadmin登录后显示“使用配置文件中定义的控制用户连接失败。”错误提示

在安装完XAMPP后,设置mysql中root账户密码为123456,并修改phpmyadmin配置中root的密码为123456之后,但是phpmyadmin登录后显示"使用配置文件中定义的控制用户连接失败."错误提示. 这是因为还有一些配置信息没有更改导致的,具体设置步骤如下: 1.找到phpmyadmin文件夹下面的config.inc.php文件并打开,找到这两行代码: $cfg['Servers'][$i]['controluser'] = 'pma'; $cfg['Serv

Web开发中需要了解的东西【转载】

在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需要知道的?)里面给出的答案非常不错,所以,我翻译转载过来. 顺便说一下,StackExchange真是非常好,大家可以对同一个答案做贡献和修订,看看这个问题的修订过程你就知道了--专业的问答网站应该怎么去做.这就是我在这篇文章中也说过真正的用户体验是什么样的.好了,下面是正文(我对原文做了一些批注,

web标准中定义id与class有什么区别吗

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh" lang="zh"> <head profil

Tomcat web.xml中定义了文件扩展名到MIME类型的映射

Tomcat在返回静态资源时,会根据资源文件的扩展名产生对应的content-type头(也即MIME类型)添加到response header中. 在Tomcat的web.xml规定了扩展名及相应MIME的映射(占了web.xml 87%的篇幅),如下: <!-- ===================== Default MIME Type Mappings =================== --> <!-- When serving static resources, Tom

Spring在web请求中定义编码

最近有几个小伙伴在开发的时候竟然还出现了乱码情况,检查了下,竟然没写filter-mapping,记录下 通过类org.springframework.web.filter.CharacterEncodingFilter,操作web.xml <filter> <filter-name>Spring character encoding filter</filter-name> <filter-class>org.springframework.web.fil

在Web.xml中定义自己的过滤器

1.过滤器代码 1 package com.zkj.filter; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.Filter; 7 import javax.servlet.FilterChain; 8 import javax.servlet.FilterConfig; 9 import javax.servlet.ServletException; 10 impo

深入浅出Zabbix 3.0 -- 第二章 Zabbix Web操作与定义

第二章  Zabbix Web操作与定义 本章介绍Zabbix 中一些基本概念的定义和web前端页面的操作,包括Zabbix中使用的一些术语的定义,Web页面中用户管理.主机和主机组的管理,以及监控项.模板.触发器.告警的管理和操作,还有Graphs.Screens.Maps及Reports等.通过本章的学习掌握一些基本概念并能够通过Web页面的操作完成对Zabbix的管理. 2.1 定义 hosts(主机) Zabbix中需要监控的服务器.交换机及其他设备我们都统一称作host,这些设备与Za

利用ASP.NET加密和解密Web.config中连接字符串

介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, Ajax, JavaScript等的文章.大多数情况下,我都把数据库的连接字符串放在了web.config中.其中包含许多敏感信息,包括连接数据库的用户名密码等.然而我们在web.config和machine.config中以纯文本的方式保存密码安全吗? 如果我们的程序只是部署在内部服务器中,这应该没