- 浏览: 875583 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
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 1297Request、Request.Form和Request.Q ... -
大型软件公司.net面试题!一定得看(附答案)
2010-01-14 14:23 1636引用 1、答案 a=a+b; b=a-b; a=a ... -
.net面试整试题及参考答案【转】
2010-01-14 14:01 2248引用 一、ADO 与ADO.NET两 ... -
最新的.Net面试题及答案
2010-01-14 13:52 4136引用 最新的.Net面试题及答案 1.a=10,b=15,在不 ... -
NET面试题集
2010-01-12 16:48 2304引用 NET面试题集2009-08-2 ... -
如何记住密码?
2010-01-11 17:00 1254封装一个类,里面两个方法,一个是写,一个是读,直接调用即可 ... -
怎样在GridView中的DropDownList选项改变的时候获取GridView中的DataKeys.Value的二种方法:
2010-01-10 19:41 3414【1】 <asp:GridView ID="G ... -
Gridview中用删除一行的问题
2010-01-10 19:39 1575html代码如下: <asp:templatefie ... -
ListView控件(一)--增,删,改,查
2010-01-10 18:13 3394ASP.NET3.5中包含了新的数据绑定控件--ListVie ... -
Repeater分页
2010-01-10 18:06 2444private void Page_Load(ob ... -
单击头模板中的checkbox,实现datalist中所有chebox的全选和取消
2010-01-10 17:48 1809使用C#和javascript都可以实现,第二种更好一些, ... -
GridView 如何获取当前行的索引值
2010-01-10 16:10 7124引用 在用GridView控件时,我们经常会碰到获取当前行的索 ... -
DataGrid和DropDownList的一些配合以及使用css定制DataGrid
2010-01-10 16:06 1343引用 有的时候我们需要 (1)在编辑的时候用下拉框选择,并且默 ... -
[ASP] asp日期函数大全
2010-01-09 16:18 27391. Now 传回系统的日期及 ... -
ASP.net随机数应用实例
2010-01-09 16:15 1027大家可能都用过Chinaren的校友录,不久前它的留言簿上加 ... -
3种方式遍历Repeater中的CheckBox全选
2010-01-09 16:14 1727方式1 引用 1 foreach (Control c in ... -
[ASP.NET2.0]Repeater C# 分页用法
2010-01-09 16:03 2810二、Web.config配置 1 <ap ... -
(摘抄)为什么设置了DropDownList的AutoPostBack="True"还是不能触发SelectedIndexChanged事件?
2010-01-09 16:01 4223曾经遇到过这个问题,后来在LoveCherry的博客中找到了更 ...
相关推荐
Visual Studio 2010高级编程.pdf
VS2019在安装的过程中,偶尔遇到报错Microsoft.VisualStudio.Community.Msi 报错的问题。怎么卸载重装都没用。用这个工具,打开后选择->卸载->vs_communitymsi 然后等待修复完毕,再重新尝试安装VS即可 VS2019在安装...
Visual Studio 2005 Remote Debugging.mht
visual studio工具控件DevComponents.DotNetBar2 多种工具 实现窗口多彩化 精心整理的visual studio工具 超强
Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.dll Microsoft.VisualStudio.DataDesign.SyncDesigner.DslPackage.dll //包含三个版本
用Microsoft Visual Studio 2005 C#.编的一个成绩排序系统,原理:数组遍历排序!
ASP.NET VisualStudio2005花卉订购.rar (团队开发与设计好的话请支持)
GitHub Extension for Visual Studio. The easiest way to connect to your GitHub repositories in Visual Studio. By downloading the extension you agree to the End-User License Agreement Requires Windows ...
Microsoft.VisualStudio.Shell.12.0.dll,版本为12.0.0.0,为VS2015开发ArcMap Add-ins所需要的类库,下载之后直接运行程序安装即可使用
扩展插件:Visual Micro - Release 21.11.08.9 - ...2. 在文件夹中搜索“Visual.Micro.Processing.Sketch.dll”文件,找到其所在的文件夹; 3. 使用压缩包中的“Visual.Micro.Processing.Sketch.dll”文件替换原文件。
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.Shell\2.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Shell.dll
VisualStudio2013Web开发.pdf
Visual Studio 97 MSDN Library ISO 7z打包下载。CD光盘总共647MB,示例文件35.6MB。信息涵盖Development Products/Tools and Technologies/ Platform, SDK, DDK/Office Development/ActiveX SDK/DAO SDK/DirectX ...
NET Framework 2.0 和 Visual Studio 2005 的功能.rar
使用visual studio C#语言工具开发excel.word.outlook.和infopath应用。
PHP Tools for Visual Studio 1.13.5282.2012 破解补丁
visual studio 2005下OpenGL配置 vs2005下OPENGL配置 visual studio 2005下OpenGL配置 vs2005下OPENGL配置 visual studio 2005下OpenGL配置 vs2005下OPENGL配置 visual studio 2005下OpenGL配置 vs2005下OPENGL配置 ...
Visual Studio 2019 16.3.5 的中文完整离线包 24.8G 百度网盘下载
[Visual.Studio.2010.高级编程].Professional.Visual.Studio.2010.pdf.003