`
ch_kexin
  • 浏览: 897837 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

通过Visual studio 2005 中的web.sitemap实现OUTLOOK风格的系统菜单

    博客分类:
  • .NET
阅读更多
Visual Studio 开发工具提供的一些功能让开发变得更加简单,比如 web.sitemap可以直接实现菜单导航,支持菜单模式和树的模式。 基本上菜单的变化,只需要配置一下 web.sitemap文件即可。

但这个功能并不一定能让最终端的用户满意,因为界面的操作风格比较单一,也只是方便的集成一些微软模式的权限控制。

如何实现一个OUTLOOK风格的菜单,并集成自有的权限体系呢。

一级菜单展开、显示下级菜单、菜单权限控制、鼠标移动时高亮显示。。。。。

这样一个菜单如何通过web.sitemap实现的呢?

   通过web.sitemap定义菜单结构及其它属性就可以实现这样的一个菜单风格

   当然要达到这样的效果还是需要对web.sitemap的使用进行一些二次开发才能实现的。

   1、扩展web.sitemap的一些属性

   [web.sitemap代码]

<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="出差授权"/>
           
    </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。

   [代码参考]

<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="出差授权"/>
           
    </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)
        {
            // 在此处放置用户代码以初始化页面
            if (!Page.IsPostBack)
            {
                LoadMenusHtml();
            }
        }

        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%"" onfocus=""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"" onclick=""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"" onmouseover=""setNavMenuBGMove(" + i.ToString() + @")"" 
                               onmouseout=""setNavMenuBGOut(" + i.ToString() + @")""
                             class=""" + (strStartIndex == strNodeIndex ? "navColumnLight" : "navColumnDark") + @""" id=""navMenu" + i.ToString() + @""" style=""height: 25px""
                             onclick=""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 onclick=""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风格的菜单了。还可以复制到其它系统中重复利用,实现重用的价值。
分享到:
评论

相关推荐

    Microsoft.VisualStudio.Shell.dll下载

    Microsoft.VisualStudio.Shell.dll提供了用于实现这些扩展的基础框架,通过Mef(Managed Extensibility Framework)和其他扩展点,使得第三方开发者能够轻松地为Visual Studio添加新功能。 3. **组件交互**:在...

    Visual Studio 2005 Remote Debugging.mht

    Visual Studio 2005 Remote Debugging.mht

    Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.

    Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.dll Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.dll //包含三个版本

    Microsoft Visual Studio 2005.iso(里面有下载软件和下载地址)

    Microsoft Visual Studio 2005.iso,此文件的容量为3.1G(里面附带一个下载软件raysource和Microsoft Visual Studio 2005.iso下载地址),需用raysource这款软件下载,如果raysource不能使用请自行下载raysource,...

    彻底解决VS2019安装Microsoft.VisualStudio.Community.Msi 报错1316的问题

    VS2019在安装的过程中,偶尔遇到报错Microsoft.VisualStudio.Community.Msi 报错的问题。怎么卸载重装都没用。用这个工具,打开后选择-&gt;卸载-&gt;vs_communitymsi 然后等待修复完毕,再重新尝试安装VS即可

    VisualStudio2013Web开发.pdf

    VisualStudio2013Web开发.pdf

    Visual Studio 2019 MSDN文档.pdf

    Visual Studio 2019是微软公司推出的一款专业集成开发环境(IDE),适用于软件开发人员进行Windows、Web和移动应用的开发。MSDN文档是Visual Studio的官方帮助资源,提供了有关软件安装、配置、使用方法和最佳实践等...

    Visual Studio的SVN插件.rar

    Visual Studio是一款广受欢迎的集成开发环境(IDE),用于编写各种类型的软件,包括Windows应用程序、Web应用和移动应用等。为了更好地支持版本控制,许多开发者选择使用Subversion(SVN)系统来管理他们的代码库。...

    Visual Studio 2019 版本 16.3.5 中文 离线安装包

    Visual Studio 2019 16.3.5 的中文完整离线包 24.8G 百度网盘下载

    c#源码Visual+Studio+2005.rar

    《C#源码在Visual Studio 2005中的应用深度解析》 在软件开发领域,C#语言凭借其强大的功能和高效的性能,已经成为.NET框架下最常用的编程语言之一。Visual Studio 2005作为微软公司推出的集成开发环境(IDE),为...

    Professional Visual Studio® 2005

    《Professional Visual Studio® 2005》这本书是专为那些使用Windows Vista操作系统,并希望过渡到Visual Studio 2005作为开发环境的程序员准备的。由于Visual C++ 6.0不支持Vista,因此这本书成为了升级工具的宝贵...

    解决vs2012 “无法启动已配置的visual studio开发web服务器”的解决办法

    解决VS2012中“无法启动已配置...Visual Studio 2012中的“无法启动已配置的Visual Studio开发Web服务器”的问题可以通过取消“启用IntelliTrace”功能来解决。开发者可以根据需要选择是否取消这个功能,以免出现问题。

    addison.wesley.visual.studio.tools.for.office.using.c.sharp.with.excel.word.outlook.and.infopath

    《使用Visual Studio C#开发Office应用:Excel、Word、Outlook和InfoPath》是一本深入探讨如何利用Microsoft Visual Studio中的C#语言工具进行Office应用程序开发的专业书籍。这本书着重讲解了如何利用C#来构建与...

    Microsoft.Visual.Studio.2005.Unleashed part2

    《Microsoft.VisualStudio.2005.Unleashed》是关于微软Visual Studio 2005的权威指南,旨在深入解析这款强大的开发工具。该书分为三部分,本部分为第二部分,以CHM(Compiled Help Manual)格式呈现,方便读者查阅和...

    无法连接到Visual Studio 的Localhost Web服务器的解决方法

    ### 无法连接到Visual Studio 的Localhost Web服务器的解决方法 在进行Web开发时,我们经常需要使用到本地Web服务器来进行测试与调试。对于使用Visual Studio作为开发环境的用户来说,有时可能会遇到无法连接到...

    VisualStudio2005使用手册

    在Visual Studio 2005中,开发者可以使用多种编程语言,如C#、Visual Basic .NET、C++等,创建Windows应用程序、Web应用、移动应用以及数据库应用。以下是一些关键知识点: 1. **界面与工作区**:手册会详细介绍...

    Visual Studio 2005制作学生成绩管理系统

    《Visual Studio 2005实现学生成绩管理系统详解》 在信息技术日益发达的今天,学生管理系统已经成为教育机构不可或缺的一部分。Visual Studio 2005作为一款强大的开发工具,为开发者提供了构建高效、稳定的应用程序...

    DevExpressPatch 8.0 for Visual Studio 2019(最新版).zip

    DevExpressPatch 8.0 for Visual Studio 2019 16.2.rar支持Visual Studio 2019 ,解压后先运行DevExpress.Patch.8.exe,然后运行 DevExpressPatch 8.0 for Visual Studio 2019\DevExpress.Patch.Vsix\DevExpress....

    Microsoft Visual Studio 2010 Uninstall Utility.

    Microsoft Visual Web Developer 2010 Express Microsoft Team Foundation Server 2010 Microsoft Visual Studio Test Agent 2010 Microsoft Visual Studio Test Controller 2010 Microsoft Visual Studio Lab Agent...

    visual studio 2021安装图文教程.docx

    1. 插入安装媒体:将 Visual Studio 2021 安装光碟插入计算机的光驱中,或者使用虚拟光驱加载 Visual Studio 2021 镜像。 2. 启动安装程序:双击 s_ultimate.exe 打开安装包,开始安装 Visual Studio 2021。 3. ...

Global site tag (gtag.js) - Google Analytics