이 글에서 소개하는 메뉴 컨트롤은 CSS와 ul 목록을 사용하여 메뉴를 표시합니다. 생성된 html은 크기가 작고 javascript 지원이 필요하지 않으며 IE6을 제외하고는 대부분의 브라우저에서 지원됩니다. CSS를 별도로.
이 기사를 통해 asp.net 컨트롤 개발과 복합 디자인 패턴의 실제 적용에 대해 알아볼 수 있습니다.
Composite 디자인 패턴을 사용하여 메뉴 클래스 디자인:
MenuCompositeitem 클래스
namespace Ruinet.Controls { [Serializable()] public class MenuCompositeItem { private List<MenuCompositeItem> _children = new List<MenuCompositeItem>(); private string _text; private string _link; private string _target; /// <summary> /// 菜单项 /// </summary> /// <param name="text">菜单名</param> /// <param name="link">链接</param> public MenuCompositeItem(string text, string link) { this._text = text; this._link = link; } /// <summary> /// 菜单项 /// </summary> /// <param name="text">菜单名</param> /// <param name="link">链接</param> /// <param name="target">跳转目标</param> public MenuCompositeItem(string text, string link, string target) { this._text = text; this._link = link; this._target = target; } /// <summary> /// 设置或获取菜单名 /// </summary> public string Text { get { return _text; } set { _text = value; } } /// <summary> /// 设置或获取链接 /// </summary> public string Link { get { return _link; } set { _link = value; } } /// <summary> /// 跳转目标 /// </summary> public string Target { get { return _target; } set { _target=value; } } /// <summary> /// 设置或获取子菜单 /// </summary> public List<MenuCompositeItem> Children { get { return _children; } set { _children = value; } } }
MenuComposite 클래스
namespace Ruinet.Controls { [DefaultProperty("Menu")] [ToolboxData("<{0}:MenuComposite runat=server></{0}:MenuComposite>")] public class MenuComposite : WebControl { /// <summary> /// 设置获取选择的菜单 /// </summary> [Bindable(true)] [DefaultValue("")] [Localizable(true)] public string SelectedMenuText { get { String s = (String)ViewState["SelectedMenuText"]; return ((s == null) ? String.Empty : s); } set { ViewState["SelectedMenuText"] = value; } } /// <summary> /// 获取和设置菜单项从ViewState /// </summary> [Bindable(true)] [DefaultValue(null)] [Localizable(true)] public MenuCompositeItem MenuItems { get { return ViewState["MenuItems"] as MenuCompositeItem; } set { ViewState["MenuItems"] = value; } } /// <summary> /// 呈现菜单结构 /// </summary> /// <param name="output">HTML输出流</param> protected override void RenderContents(HtmlTextWriter output) { MenuCompositeItem root = this.MenuItems; output.Write(@"<div class=""navmenu"">"); output.Write(@" <ul>"); for (int i = 0; i < root.Children.Count; i++) { RecursiveRender(output, root.Children[i]); } output.Write(@" </ul>"); output.Write(@"</div>"); } /// <summary> /// 递归输出菜单项 /// </summary> /// <param name="output">HTML输出流</param> /// <param name="item">菜单项.</param> /// <param name="depth">Indentation depth.</param> private void RecursiveRender(HtmlTextWriter output, MenuCompositeItem item) { output.Write("<li>"); if (string.IsNullOrEmpty(item.Target))//为空不设置跳转目标 { output.Write(@"<a href=""" + item.Link + @""">"); } else { output.Write(@"<a href=""" + item.Link + @""" target= """ + item.Target + @""">"); } if (item.Text == SelectedMenuText) //选中的菜单 { output.Write(@"<span class=""selected"">"); output.WriteLine(item.Text); output.WriteLine("</span>"); } else { output.Write(item.Text); } output.Write("</a>"); if (item.Children.Count > 0) { output.WriteLine(); output.Write("<ul>"); for (int i = 0; i < item.Children.Count; i++) { RecursiveRender(output, item.Children[i]); } output.Write("</ul>"); } output.Write("</li>"); } } }
참조를 추가한 후 페이지에서
사용 "도구 상자" - "컨트롤 구성 요소
에서 직접 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 목록을 생성합니다.
따라서 표시할 수 있는 메뉴 항목을 생성하고 숨김, 핵심은 CSS입니다. 설정 측면에서 보조 하위 메뉴를 Hidden Visibility: Hidden;
으로 설정하고 동시에 li:hover: 메뉴의 표시 여부를 변경해야 합니다. visible; 일반적인 원칙은 이것이며, 물론 메뉴 항목의 위치에 주의하세요
가로로 표시될 수 있도록 1단계 메뉴 float:left;
CSS는 다음과 같이 정의됩니다.
.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를 정의한 후의 효과는 다음과 같습니다.
이 메뉴 컨트롤이 완료되었습니다. IE7, IE8, Chrome, Firefox에서는 정상적으로 표시되는 것으로 테스트되었습니다. IE6에서는 문제가 있을 수 있습니다. 수정은
관련 기사를 참조하세요. Asp.net 메뉴 컨트롤의 간단한 버전, PHP 중국어 웹사이트에 주목하세요!