- 浏览: 908743 次
- 性别:
- 来自: 青岛
-
文章分类
最新评论
-
chienchia:
请问下,第4步,vpn做了什么使数据包发送到真实网卡,而不会再 ...
如何使用Android系统自带的VPN服务框架 -
fangyafenqidai:
我只要选第二个就可以呢,怒需要选第一个。之后不会有啥问题。正常 ...
Android Studio 超级简单的打包生成apk -
michaelye1988:
不错,很棒!
getcachedir和getexternalcachedir的区别 -
whlei01:
文章棒棒哒
常用的AS3代码 -
whlei01:
很不错 之前打开及时600M的内存 ,现在打开只有300兆了 ...
flash builder内存不够的解决办法
Visual Studio 开发工具提供的一些功能让开发变得更加简单,比如 web.sitemap可以直接实现菜单导航,支持菜单模式和树的模式。 基本上菜单的变化,只需要配置一下 web.sitemap文件即可。
但这个功能并不一定能让最终端的用户满意,因为界面的操作风格比较单一,也只是方便的集成一些微软模式的权限控制。
如何实现一个OUTLOOK风格的菜单,并集成自有的权限体系呢。
一级菜单展开、显示下级菜单、菜单权限控制、鼠标移动时高亮显示。。。。。
这样一个菜单如何通过web.sitemap实现的呢?
通过web.sitemap定义菜单结构及其它属性就可以实现这样的一个菜单风格
当然要达到这样的效果还是需要对web.sitemap的使用进行一些二次开发才能实现的。
1、扩展web.sitemap的一些属性
[web.sitemap代码]
比如:target="_parent"disenable="true"startIndex="1" AdminIndex。。。都是扩展的属性,用于一些控制逻辑的实现
2、根据输出一级菜单控制HTML及脚本
当然B/S系统实现OUTLOOK风格的菜单一定也是一些HTML、样式表、脚本来实现的。实现这一功能开发要做的事情是,根据sitemap的一级菜单设置输出相应的HTML。
[代码参考]
3、权限控制
在大部分国内的系统用户,是希望能在菜单上控制到权限的,权限的实现是跟某个具体的系统管理模块紧密相关的。Sitemap提供的权限控制跟微软提供的权限模块紧密梆定但不一定能满足国内系统的管理需求。
需要在sitemap上实现自己的权限控制代码。
[代码参考]
4、利用缓存技术进行优化
因为菜单页面的访问是非常频繁的,但用户和权限的变化频率比较小,对于大规模访问的系统来说,不要忘记利用缓存技术进行优化。 由于页面的输出跟用户有关,因此利用visual studio 2005的页面缓存功能就可以非常简单的实现了。
在菜单页面上加上标记:
<%@ OutputCache Duration="300000" VaryByParam="*"%> 即可,因为URL上已经将参数区别了。系统会自动根据参数不同缓存相应的版本。
5、配置sitemap实现功能
以上开发完成后,通过配置sitemap即可实现OUTLOOK风格的菜单了。还可以复制到其它系统中重复利用,实现重用的价值。
但这个功能并不一定能让最终端的用户满意,因为界面的操作风格比较单一,也只是方便的集成一些微软模式的权限控制。
如何实现一个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风格的菜单了。还可以复制到其它系统中重复利用,实现重用的价值。
发表评论
-
Request、Request.Form和Request.QueryString的区别
2012-08-13 14:46 1351Request、Request.Form和Request.Q ... -
大型软件公司.net面试题!一定得看(附答案)
2010-01-14 14:23 1678引用 1、答案 a=a+b; b=a-b; a=a ... -
.net面试整试题及参考答案【转】
2010-01-14 14:01 2346引用 一、ADO 与ADO.NET两 ... -
最新的.Net面试题及答案
2010-01-14 13:52 4234引用 最新的.Net面试题及答案 1.a=10,b=15,在不 ... -
NET面试题集
2010-01-12 16:48 2372引用 NET面试题集2009-08-2 ... -
如何记住密码?
2010-01-11 17:00 1292封装一个类,里面两个方法,一个是写,一个是读,直接调用即可 ... -
怎样在GridView中的DropDownList选项改变的时候获取GridView中的DataKeys.Value的二种方法:
2010-01-10 19:41 3454【1】 <asp:GridView ID="G ... -
Gridview中用删除一行的问题
2010-01-10 19:39 1661html代码如下: <asp:templatefie ... -
ListView控件(一)--增,删,改,查
2010-01-10 18:13 3453ASP.NET3.5中包含了新的数据绑定控件--ListVie ... -
Repeater分页
2010-01-10 18:06 2485private void Page_Load(ob ... -
单击头模板中的checkbox,实现datalist中所有chebox的全选和取消
2010-01-10 17:48 1861使用C#和javascript都可以实现,第二种更好一些, ... -
GridView 如何获取当前行的索引值
2010-01-10 16:10 7246引用 在用GridView控件时,我们经常会碰到获取当前行的索 ... -
DataGrid和DropDownList的一些配合以及使用css定制DataGrid
2010-01-10 16:06 1461引用 有的时候我们需要 (1)在编辑的时候用下拉框选择,并且默 ... -
[ASP] asp日期函数大全
2010-01-09 16:18 28261. Now 传回系统的日期及 ... -
ASP.net随机数应用实例
2010-01-09 16:15 1075大家可能都用过Chinaren的校友录,不久前它的留言簿上加 ... -
3种方式遍历Repeater中的CheckBox全选
2010-01-09 16:14 1765方式1 引用 1 foreach (Control c in ... -
[ASP.NET2.0]Repeater C# 分页用法
2010-01-09 16:03 2854二、Web.config配置 1 <ap ... -
(摘抄)为什么设置了DropDownList的AutoPostBack="True"还是不能触发SelectedIndexChanged事件?
2010-01-09 16:01 4274曾经遇到过这个问题,后来在LoveCherry的博客中找到了更 ...
相关推荐
Microsoft.VisualStudio.Shell.dll提供了用于实现这些扩展的基础框架,通过Mef(Managed Extensibility Framework)和其他扩展点,使得第三方开发者能够轻松地为Visual Studio添加新功能。 3. **组件交互**:在...
Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.dll Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.dll //包含三个版本
VS2019在安装的过程中,偶尔遇到报错Microsoft.VisualStudio.Community.Msi 报错的问题。怎么卸载重装都没用。用这个工具,打开后选择->卸载->vs_communitymsi 然后等待修复完毕,再重新尝试安装VS即可
Visual Studio 2019 16.3.5 的中文完整离线包 24.8G 百度网盘下载
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.Shell\2.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Shell.dll
Microsoft Visual Studio 2005.iso,此文件的容量为3.1G(里面附带一个下载软件raysource和Microsoft Visual Studio 2005.iso下载地址),需用raysource这款软件下载,如果raysource不能使用请自行下载raysource,...
VisualStudio2013Web开发.pdf
Visual Studio 2019是微软公司推出的一款专业集成开发环境(IDE),适用于软件开发人员进行Windows、Web和移动应用的开发。MSDN文档是Visual Studio的官方帮助资源,提供了有关软件安装、配置、使用方法和最佳实践等...
Visual Studio是一款广受欢迎的集成开发环境(IDE),用于编写各种类型的软件,包括Windows应用程序、Web应用和移动应用等。为了更好地支持版本控制,许多开发者选择使用Subversion(SVN)系统来管理他们的代码库。...
《C#源码在Visual Studio 2005中的应用深度解析》 在软件开发领域,C#语言凭借其强大的功能和高效的性能,已经成为.NET框架下最常用的编程语言之一。Visual Studio 2005作为微软公司推出的集成开发环境(IDE),为...
14. 学习 Visual Studio:Visual Studio 提供了多种学习资源,例如运行程序、打开存储库中的项目、编写和编辑代码、编译和生成、调试代码、单元测试、部署项目、访问数据等。 Visual Studio 是一个功能丰富的集成...
《Professional Visual Studio® 2005》这本书是专为那些使用Windows Vista操作系统,并希望过渡到Visual Studio 2005作为开发环境的程序员准备的。由于Visual C++ 6.0不支持Vista,因此这本书成为了升级工具的宝贵...
这是微软件开发工具VisualStudio2019的使用手册,微软件提供了在线版本,本文档可离线查阅
### 无法连接到Visual Studio 的Localhost Web服务器的解决方法 在进行Web开发时,我们经常需要使用到本地Web服务器来进行测试与调试。对于使用Visual Studio作为开发环境的用户来说,有时可能会遇到无法连接到...
解决VS2012中“无法启动已配置...Visual Studio 2012中的“无法启动已配置的Visual Studio开发Web服务器”的问题可以通过取消“启用IntelliTrace”功能来解决。开发者可以根据需要选择是否取消这个功能,以免出现问题。
《使用Visual Studio C#开发Office应用:Excel、Word、Outlook和InfoPath》是一本深入探讨如何利用Microsoft Visual Studio中的C#语言工具进行Office应用程序开发的专业书籍。这本书着重讲解了如何利用C#来构建与...
《Microsoft.VisualStudio.2005.Unleashed》是关于微软Visual Studio 2005的权威指南,旨在深入解析这款强大的开发工具。该书分为三部分,本部分为第二部分,以CHM(Compiled Help Manual)格式呈现,方便读者查阅和...
总之,Gitee.VisualStudio.vsix插件是.NET开发者与Gitee协作的理想工具,它将Visual Studio的强大功能与Gitee的版本控制和项目管理功能完美结合,让开发者在熟悉的开发环境中实现高效的代码管理和团队协作。
在Visual Studio 2005中,开发者可以使用多种编程语言,如C#、Visual Basic .NET、C++等,创建Windows应用程序、Web应用、移动应用以及数据库应用。以下是一些关键知识点: 1. **界面与工作区**:手册会详细介绍...
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...