设为首页 收藏本站
查看: 1489|回复: 0

[经验分享] 通过Visual studio 2005 中的web.sitemap实现OUTLOOK风格的系统菜单

[复制链接]

尚未签到

发表于 2015-9-12 13:40:31 | 显示全部楼层 |阅读模式
  通过Visual studio 2005 中的web.sitemap实现OUTLOOK风格的系统菜单
  Visual Studio 开发工具提供的一些功能让开发变得更加简单,比如 web.sitemap可以直接实现菜单导航,支持菜单模式和树的模式。 基本上菜单的变化,只需要配置一下 web.sitemap文件即可。
  但这个功能并不一定能让最终端的用户满意,因为界面的操作风格比较单一,也只是方便的集成一些微软模式的权限控制。
  如何实现一个OUTLOOK风格的菜单,并集成自有的权限体系呢。
  如图
   DSC0000.jpg
    一级菜单展开、显示下级菜单、菜单权限控制、鼠标移动时高亮显示。。。。。
  这样一个菜单如何通过web.sitemap实现的呢?
  通过web.sitemap定义菜单结构及其它属性就可以实现这样的一个菜单风格
  当然要达到这样的效果还是需要对web.sitemap的使用进行一些二次开发才能实现的。
  1、扩展web.sitemap的一些属性
  [web.sitemap代码]

  

DSC0001.gif <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <!--disenable为true表示显示全部菜单,如果没权限显示不可用,如果为false表示没有权限则移除-->
  <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="出差授权"/>
            DSC0002.gif
    </siteMapNode>
   
   .   
    <siteMapNode title="系统管理" img="skins/2004/images/icon/sKms.gif"  menuIndex="9"  url ="~\9.aspx">
      <siteMapNode title="部门维护" url="~\DeptForms\frmMain.htm" description="部门维护"/>
      <siteMapNode title="用户管理"  url="~\DeptForms\frmUsers.htm" description="用户管理"/>
      ..
    </siteMapNode>
  </siteMapNode>
</siteMap>  
     比如:target="_parent"disenable="true"startIndex="1" AdminIndex。。。都是扩展的属性,用于一些控制逻辑的实现
  2、根据输出一级菜单控制HTML及脚本
  当然B/S系统实现OUTLOOK风格的菜单一定也是一些HTML、样式表、脚本来实现的。实现这一功能开发要做的事情是,根据sitemap的一级菜单设置输出相应的HTML。
  [代码参考]

  

protected void Page_Load(object sender, System.EventArgs e)
DSC0003.gif DSC0004.gif         {
DSC0005.gif             // 在此处放置用户代码以初始化页面
            if (!Page.IsPostBack)
DSC0006.gif DSC0007.gif             {
                LoadMenusHtml();
DSC0008.gif             }
DSC0009.gif         }

        private void LoadMenusHtml()
        {

            string strTitle = "";
            string strMenus = "";
            string strUserName = Session["UserName"].ToString().Trim();
            Epower.ITSM.SqlDAL.UIMethod ui = new Epower.ITSM.SqlDAL.UIMethod();

           ui.GetMenuHtml(Session["UserName"].ToString(), (long)Session["UserID"], ref strTitle, ref strMenus);
            
            litMenuTitle.Text = strTitle;
            litMenus.Text = strMenus;
        }

/**//// <summary>
        /// 获取普通用户菜单HTML
        /// </summary>
        /// <param name="lngUserID"></param>
        /// <param name="strHeader"></param>
        /// <param name="strMens"></param>
        public  void GetMenuHtml(string strUserName,long lngUserID,ref string strHeader,ref string strMens)
        {
            StringBuilder sb = new StringBuilder("");

            StringBuilder sbTitle = new StringBuilder("");

            bool isManager = UserDP.IsManager(lngUserID);

            string strStartIndex = SiteMap.RootNode["startIndex"];
            string strAdminIndex = SiteMap.RootNode["AdminIndex"];

            string strNodeIndex = "";
            if (strAdminIndex == strStartIndex)
            {
                //如果相同则取第一个   实际设置中几乎不太可能设置成一个
                strStartIndex = "1";
            }

            SiteMapNodeCollection childCollection = SiteMap.RootNode.ChildNodes;

            sb.Append(@"<table class=""navContent"" height=""100%"" cellSpacing=""0"" cellPadding=""0"" width=""96%"" align=""center""
                                    border=""0"">
                                    <tr>
                                        <td vAlign=""top"" bgColor=""#ffffff"" height=""100%""><iframe id=""frameColumnNav"" style=""WIDTH: 100%; HEIGHT: 100%"" this.blur();"" border=""0""
                                                name=""frameColumnNav"" marginWidth=""0"" marginHeight=""0"" src=""submenu.aspx?username=" + strUserName + "&mid=" + strStartIndex + @""" frameBorder=""0"" scrolling=""auto""></iframe>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td style=""CURSOR: hand"" setNavMenu();"" vAlign=""bottom"" align=""center"" background=""skins/2004/images/bg_middle1_main.gif""
                                            height=""5""><IMG height=""5"" src=""skins/2004/images/bg_middle1_button.gif""></td>
                                    </tr>
                                    <tr id=""navMenu"" name=""navMenu"">
                                        <td vAlign=""bottom"" bgColor=""#ffffff"" height=""0px"">
                                            <table id=""tableNAV"" cellSpacing=""0"" cellPadding=""0"" width=""100%"" align=""center"" border=""0""
                                                name=""tableNAV"">");




            int i = 1;
            foreach (SiteMapNode node in childCollection)
            {
                strNodeIndex = node["menuIndex"];
                if (isManager == true || strNodeIndex != strAdminIndex)
                {
                    sb.Append(@"<tr><td align=""left"" setNavMenuBGMove(" + i.ToString() + @")""
                               onmouseout=""setNavMenuBGOut(" + i.ToString() + @")""
                             class=""" + (strStartIndex == strNodeIndex ? "navColumnLight" : "navColumnDark") + @""" id=""navMenu" + i.ToString() + @""" style=""height: 25px""
                             navTitleDiv.innerHTML='" + node.Title + @"';document.all.frameColumnNav.src='submenu.aspx?username=" + strUserName + "&mid=" + strNodeIndex + @"';
                                                     setNavMenuBG(" + i.ToString() + @")""
                                 ><IMG src=""" + node["img"] + @""" width=""16"" align=""absMiddle"">
                                                        <A href=""#"">" + node.Title + @"</A>
                                                    </td>
                                                </tr>");
                    if (strStartIndex == strNodeIndex)
                    {
                        //因为 开始ID 不可能与 管理ID相同,因此 此句一定能执行得到
                        sbTitle.Append(@"<div class=""navTitle"" id=""navTitleDiv"" name=""navTitleDiv"">" + node.Title + @"</div>");
                    }
                    i++;
                }
            }

            sb.Append(@"</table>
                                            <table id=""tableNavIndex"" cellSpacing=""0"" cellPadding=""0"" width=""100%"" border=""0"" name=""tableNavIndex"">
                                                <tr>
                                                    <td class=""navColumnDark"" id=""navMenuIndex"" style=""DISPLAY: none"" height=""25"">
                                                        <div align=""center"" width=""100%""> ");
            i = 1;
            foreach (SiteMapNode node in childCollection)
            {
                strNodeIndex = node["menuIndex"];
                if (isManager == true || strNodeIndex != strAdminIndex)
                {
                    sb.Append(@"<A navTitleDiv.innerHTML='" + node.Title + @"';document.all.frameColumnNav.src='submenu.aspx?username=" + strUserName + "&mid=" + strNodeIndex + @"';setNavMenuBG(" + i.ToString() + @")""
                                                                href=""#""><IMG title=""" + node.Title + @""" src=""" + node["img"] + @""" width=""16"" align=""absMiddle""
                                                                    border=""0""></A> ");
                    i++;
                }
            }

            sb.Append(@"</div>
                                                    </td>
                                                </tr>
                                            </table>
                                        </td>
                                    </tr>
                                </table>");

            strHeader = sbTitle.ToString();
            strMens = sb.ToString();
        }
  
   3、权限控制
  在大部分国内的系统用户,是希望能在菜单上控制到权限的,权限的实现是跟某个具体的系统管理模块紧密相关的。Sitemap提供的权限控制跟微软提供的权限模块紧密梆定但不一定能满足国内系统的管理需求。
  需要在sitemap上实现自己的权限控制代码。
  [代码参考]

  

/**//// <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);
                    }
                }
            }
        }  
   4、利用缓存技术进行优化
  因为菜单页面的访问是非常频繁的,但用户和权限的变化频率比较小,对于大规模访问的系统来说,不要忘记利用缓存技术进行优化。 由于页面的输出跟用户有关,因此利用visual studio 2005的页面缓存功能就可以非常简单的实现了。
  在菜单页面上加上标记:
  <%@ OutputCache Duration="300000" VaryByParam="*"%> 即可,因为URL上已经将参数区别了。系统会自动根据参数不同缓存相应的版本。
  5、配置sitemap实现功能
  以上开发完成后,通过配置sitemap即可实现OUTLOOK风格的菜单了。还可以复制到其它系统中重复利用,实现重用的价值。
  E8.Net开源架构提供了这一功能的全部代码。用户可以直接使用或参考,并在此基础上更加的完善
  E8.Net工作流架构大量节约用户的开发成本为企业应用开发提供起点,提升软件生产力,欢迎访问:http://***/
  
  
  
  E8.Net工作流平台 提升企业战略执行力
http://***
  E8在线,打造中小企业一站式管理软件租用平台
  http://www.onlinee8.net
  
  E8系列软件又添新成员 E8CRM 带流程的CRM软件 http://www.e8crm.com
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-112709-1-1.html 上篇帖子: 让outlook自动检查“空标题”和“空附件” 下篇帖子: Outlook应用开发(3)之插件引擎
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表