`
ch_kexin
  • 浏览: 903660 次
  • 性别: 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. **组件交互**:在...

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

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

    Microsoft.VisualStudio.Shell.dll

    C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.Shell\2.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Shell.dll

    VisualStudio2013Web开发.pdf

    VisualStudio2013Web开发.pdf

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

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

    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)系统来管理他们的代码库。...

    c#源码Visual+Studio+2005.rar

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

    Visual Studio 教程 _ C#.pdf

    14. 学习 Visual Studio:Visual Studio 提供了多种学习资源,例如运行程序、打开存储库中的项目、编写和编辑代码、编译和生成、调试代码、单元测试、部署项目、访问数据等。 Visual Studio 是一个功能丰富的集成...

    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”功能来解决。开发者可以根据需要选择是否取消这个功能,以免出现问题。

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

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

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

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

    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)格式呈现,方便读者查阅和...

    Gitee.VisualStudio.vsix Gitee vs插件(Gitee Extension for Visual Studio)

    总之,Gitee.VisualStudio.vsix插件是.NET开发者与Gitee协作的理想工具,它将Visual Studio的强大功能与Gitee的版本控制和项目管理功能完美结合,让开发者在熟悉的开发环境中实现高效的代码管理和团队协作。

    VisualStudio2005使用手册

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

    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 2005制作学生成绩管理系统

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

    Visual Studio 2008卸载工具.zip

    删除“Microsoft Visual Studio Web Authoring Component / Microsoft Web Designer Tools” 删除“Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime” 删除“Microsoft Visual ...

Global site tag (gtag.js) - Google Analytics