0

0

Asp.net 菜单控件简洁版

高洛峰

高洛峰

发布时间:2017-01-11 10:30:58

|

1979人浏览过

|

来源于php中文网

原创

本文介绍的菜单控件采用的css 和ul list来显示菜单,生成的html小,无需javascript支持,对大部分的浏览器都支持,除ie6要单独修改css也可以使其支持。 
通过本文可以了解asp.net 控件的开发,及composite设计模式的实际运用。 
采用composite设计模式设计菜单类: 
menucompositeitem类 

namespace Ruinet.Controls 
{ 
[Serializable()] 
public class MenuCompositeItem 
{ 
private List _children = new List(); 
private string _text; 
private string _link; 
private string _target; 
///  
/// 菜单项 
///  
/// 菜单名 
/// 链接 
public MenuCompositeItem(string text, string link) 
{ 
this._text = text; 
this._link = link; 
} 
///  
/// 菜单项 
///  
/// 菜单名 
/// 链接 
/// 跳转目标 
public MenuCompositeItem(string text, string link, string target) 
{ 
this._text = text; 
this._link = link; 
this._target = target; 
} 
///  
/// 设置或获取菜单名 
///  
public string Text 
{ 
get { return _text; } 
set { _text = value; } 
} 
///  
/// 设置或获取链接 
///  
public string Link 
{ 
get { return _link; } 
set { _link = value; } 
} 
///  
/// 跳转目标 
///  
public string Target 
{ 
get { return _target; } 
set { _target=value; } 
} 
///  
/// 设置或获取子菜单 
///  
public List Children 
{ 
get { return _children; } 
set { _children = value; } 
} 
}

MenuComposite类 

namespace Ruinet.Controls 
{ 
[DefaultProperty("Menu")] 
[ToolboxData("<{0}:MenuComposite runat=server>")] 
public class MenuComposite : WebControl 
{ 
///  
/// 设置获取选择的菜单 
///  
[Bindable(true)] 
[DefaultValue("")] 
[Localizable(true)] 
public string SelectedMenuText 
{ 
get 
{ 
String s = (String)ViewState["SelectedMenuText"]; 
return ((s == null) ? String.Empty : s); 
} 
set 
{ 
ViewState["SelectedMenuText"] = value; 
} 
} 
///  
/// 获取和设置菜单项从ViewState 
///  
[Bindable(true)] 
[DefaultValue(null)] 
[Localizable(true)] 
public MenuCompositeItem MenuItems 
{ 
get 
{ 
return ViewState["MenuItems"] as MenuCompositeItem; 
} 
set 
{ 
ViewState["MenuItems"] = value; 
} 
} 
///  
/// 呈现菜单结构 
///  
/// HTML输出流 
protected override void RenderContents(HtmlTextWriter output) 
{ 
MenuCompositeItem root = this.MenuItems; 
output.Write(@"
"); output.Write(@"
    "); for (int i = 0; i < root.Children.Count; i++) { RecursiveRender(output, root.Children[i]); } output.Write(@"
"); output.Write(@"
"); } /// /// 递归输出菜单项 /// /// HTML输出流 /// 菜单项. /// Indentation depth. private void RecursiveRender(HtmlTextWriter output, MenuCompositeItem item) { output.Write("
  • "); if (string.IsNullOrEmpty(item.Target))//为空不设置跳转目标 { output.Write(@""); } else { output.Write(@""); } if (item.Text == SelectedMenuText) //选中的菜单 { output.Write(@""); output.WriteLine(item.Text); output.WriteLine(""); } else { output.Write(item.Text); } output.Write(""); if (item.Children.Count > 0) { output.WriteLine(); output.Write("
      "); for (int i = 0; i < item.Children.Count; i++) { RecursiveRender(output, item.Children[i]); } output.Write("
    "); } output.Write("
  • "); } } }

    在页面中使用 
    添加对控件的引用后就可以直接在“工具箱”-》Controls组件中 看到MenuComposite组件 
    再就可以像其他asp.net 控件一样使用 
    使用: 

    MenuCompositeItem root = new MenuCompositeItem("root", null); 
    MenuCompositeItem menu01 = new MenuCompositeItem("menu01", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu02 = new MenuCompositeItem("menu02", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu03 = new MenuCompositeItem("menu03", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu04 = new MenuCompositeItem("menu04", ResolveUrl("~/Page04.aspx")); 
    MenuCompositeItem menu05 = new MenuCompositeItem("menu05", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu01_01 = new MenuCompositeItem("menu01-01", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu01_02 = new MenuCompositeItem("menu01-02", ResolveUrl("~/Page01-02.aspx")); 
    MenuCompositeItem menu01_03 = new MenuCompositeItem("menu01-03", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu01_04 = new MenuCompositeItem("menu01-04", ResolveUrl("~/Default.aspx")); 
    menu01.Children.Add(menu01_01); 
    menu01.Children.Add(menu01_02); 
    menu01.Children.Add(menu01_03); 
    menu01.Children.Add(menu01_04); 
    
    MenuCompositeItem menu02_01 = new MenuCompositeItem("menu02-01", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu02_02 = new MenuCompositeItem("menu02-02", ResolveUrl("~/Default.aspx"), "menu02-02"); 
    menu02.Children.Add(menu02_01); 
    menu02.Children.Add(menu02_02); 
    
    MenuCompositeItem menu04_01 = new MenuCompositeItem("menu04-01", ResolveUrl("~/Default.aspx")); 
    MenuCompositeItem menu04_02 = new MenuCompositeItem("menu04-02", ResolveUrl("~/Page04-02.aspx"), "_blank"); 
    menu04.Children.Add(menu04_01); 
    menu04.Children.Add(menu04_02); 
    root.Children.Add(menu01); 
    root.Children.Add(menu02); 
    root.Children.Add(menu03); 
    root.Children.Add(menu04); 
    root.Children.Add(menu05);

    TheMenuComposite.MenuItems = root; 
    此时生成的编译运行后会生成一个没有样式Ul list ,效果如下: 

    Asp.net 菜单控件简洁版

    因此要生成可显示和隐藏的菜单项,关键在css的设置上,开始时将二级子菜单设置为隐藏visibility: hidden; 
    同时定义li的hover事件,li:hover时:自菜单的 visibility要改为visible; 大致原理是这样,当然还有注意菜单项的位置 
    一级菜单float:left;使其能水平显示。 
    CSS定义如下: 

    简洁时尚的jQuery和CSS3侧边栏菜单插件
    简洁时尚的jQuery和CSS3侧边栏菜单插件

    sidenav是一款简洁时尚的jQuery和CSS3侧边栏菜单插件。该侧边栏插件具有手风琴的多级菜单效果,使用简单,效果简洁大方。

    下载
    .navmenu * 
    { 
    margin: 0; 
    padding: 0; 
    } 
    .navmenu 
    { 
    border: #000 1px solid; 
    height: 25px; 
    } 
    .navmenu li 
    { 
    /*水平菜单*/ 
    float: left; 
    list-style: none; 
    position: relative; 
    } 
    .navmenu a 
    { 
    display: block; 
    font-size: 12px; 
    height: 24px; 
    width: 100px; 
    line-height: 24px; 
    background-color: #CDEB8B; 
    color: #0000ff; 
    text-decoration: none; 
    text-align: center; 
    border-left: #36393D 1px inset; 
    border-right: #36393D 1px inset; 
    border-bottom: #36393D 1px inset; 
    } 
    /*单独设置一级菜单样式*/ 
    .navmenu > ul > li > a 
    { 
    font-size: 11px; 
    font-weight: bold; 
    } 
    .navmenu a:hover 
    { 
    background: #369; 
    color: #fff; 
    } 
    /*新增的二级菜单部分*/ 
    .navmenu ul ul 
    { 
    visibility: hidden; /*开始时是隐藏的*/ 
    position: absolute; 
    left: 0px; 
    top: 24px; 
    } 
    .navmenu ul li:hover ul, .navmenu ul a:hover ul 
    { 
    visibility: visible; 
    } 
    .navmenu ul ul li 
    { 
    clear: both; /*垂直显示*/ 
    text-align: left; 
    } 
    /*选中菜单项*/ 
    .navmenu .selected 
    { 
    padding-left:15px; 
    background-position-x:0px; 
    background-image: url(./res/selected.gif); 
    background-repeat: no-repeat; 
    text-decoration:underline; 
    }

    定义CSS后的效果如下: 

    Asp.net 菜单控件简洁版

    到此菜单控件已完成。已测试过可以在IE7,IE8,Chrome,Firefox中正常显示,在IE6显示可能会有问题,可以参考纯CSS多级菜单 进行修改, 
    更多Asp.net 菜单控件简洁版相关文章请关注PHP中文网!

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    go语言 注释编码
    go语言 注释编码

    本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

    2

    2026.01.31

    go语言 math包
    go语言 math包

    本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

    1

    2026.01.31

    go语言输入函数
    go语言输入函数

    本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

    1

    2026.01.31

    golang 循环遍历
    golang 循环遍历

    本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

    0

    2026.01.31

    Golang人工智能合集
    Golang人工智能合集

    本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

    1

    2026.01.31

    2026赚钱平台入口大全
    2026赚钱平台入口大全

    2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

    76

    2026.01.31

    高干文在线阅读网站大全
    高干文在线阅读网站大全

    汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

    73

    2026.01.31

    无需付费的漫画app大全
    无需付费的漫画app大全

    想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

    67

    2026.01.31

    漫画免费在线观看地址大全
    漫画免费在线观看地址大全

    想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

    19

    2026.01.31

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    ThinkPHP6.x 微实战--十天技能课堂
    ThinkPHP6.x 微实战--十天技能课堂

    共26课时 | 1.7万人学习

    php初学者入门课程
    php初学者入门课程

    共10课时 | 0.6万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号