65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 XML 数据源的导航菜单

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.13/5 (9投票s)

2008年8月9日

CPOL

2分钟阅读

viewsIcon

106934

downloadIcon

2037

使用 XML 作为数据源的导航菜单:ASP.NET 服务器控件

NavigationMenu/menu1.jpg

引言

在我的 Web 设计生涯中,我一直需要具有动态内容且易于编辑和自定义的导航菜单。上个月,我决定编写一个简单的菜单控件,该控件使用 CSS 进行样式设置,并使用 XML 作为菜单项的来源。

导航菜单服务器控件

<?xml version="1.0" encoding="utf-8" ?>

<menuitems>
  <item id="1" url="Default.aspx" linkname="Main Page"
      description="Main Page of web siter"/>
  <item id="2" url="Default2.aspx" 
  linkname="Company" description="Company Details"/>
  <item id="3" url="Default3.aspx" 
  linkname="Photos" description="Photo Gallery"/>
  <item id="4" url="Default4.aspx" 
  linkname="Contact" description="Contact Form"/>
</menuitems>

这是菜单项和链接的 XML 模板。

在 Visual Studio 菜单中,按照以下树形结构操作:文件 - 新建 - 项目 - Web - ASP.NET 服务器控件,并创建一个新的服务器控件项目。默认情况下,会安装 ServerControl1.cs。右键单击项目,并添加一个名为 xmlreader.cs 的新类。在这个类中,首先我们定义一个代表菜单项的对象。为了简单起见,我们称之为 menuitem

using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Text;
using System.Collections;

public class menuitem
{
    public menuitem() { }
    private string id; //id of item
    private string url; // url for menu link
    private string linkname; //name of the link that will be displayed
    private string description;  // description displayed when mouse hover

    public string Id { get { return id; } set { id = value; } }
    public string Url { get { return url; } set { url = value; } }
    public string Linkname { get { return linkname; } set { linkname = value; } }
    public string Description { get { return description; } 
        set { description = value; } }
}

定义 menuitem 后,我们将创建一个名为 getMenuarraylist 类实例到 xmlreader 类中。在 getMenu 方法中,我们使用 XLINQ 读取 XML。此方法接受两个参数

  • 路径
  • xmlFilename
public ArrayList getMenu(string xmlPath, string xmlFileName)
{
    //array List to get menu items from xml
    ArrayList menuitems = new ArrayList();
    try
    {
        XElement xmenu = XElement.Load(xmlPath + xmlFileName);
        if (xmenu != null)
        {
            //get data from xml for menu items using XLINQ
            var xc = from c in xmenu.Elements("item")
            orderby c.Attribute("id").Value
            select new
                {
                ID = c.Attribute("id"),
                URL = c.Attribute("url"),
                LINKNAME = c.Attribute("linkname"),
                DESCRIPTION = c.Attribute("description")
                };
            foreach (var l in xc)
            {
                menuitem itm = new menuitem();
                //item id
                itm.Id = l.ID.Value;
                //menu item url
                itm.Url = l.URL.Value;
                //menu item name
                itm.Linkname = l.LINKNAME.Value;
                //menu description
                itm.Description = l.DESCRIPTION.Value;
                menuitems.Add(itm);
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    //return menu items
    return menuitems;
}

在上述方法中,我们创建了一个 arraylist。现在我们必须创建我们的 HTML 代码。为此,我们转到 ServerControl1.cs 类。

menuHtmlGenerator 方法是获取 arraylist 中的项目,使用 xmlreader 中的 getMenu 构建,并创建 HTML 页面的标记代码的方法。

    protected string menuHtmlGenerator(ArrayList aList)
    {
        StringBuilder s = new StringBuilder();
        
        //looping through Arraylist collection of Links.
        for (int i = 0; i < aList.Count; i++)
        {
            s.Append(System.Environment.NewLine);
            
            s.Append("<li >");

            s.Append("<a href ='" + ((menuitem)aList[i]).Url + "' ");
    
            s.Append("title='" + ((menuitem)aList[i]).Description + "' ");
        
            //if menu will show different class for currently selected item
            if (useDiffCssForCrrntItem)
            {
                if (((menuitem)aList[i]).Id == currentItemId)
                s.Append("class='" + currentItemClass + "' ");
            }
    
            s.Append(">");
        
            s.Append("<span>" + ((menuitem)aList[i]).Linkname + "</span> ");
    
            s.Append("</a>");

            s.Append("</li>");

            s.Append(System.Environment.NewLine);
        }
        //Return Full HTML Code As String
        return s.ToString();
    }
}

生成 HTML 代码后,我们使用从 WebControl 派生的方法。在该方法中,我们首先声明菜单的属性。它们将用作设计时属性来定制控件。

public class ServerControl1 : WebControl
{
    #region 7 properties for design-time attritubes

    private string xmlPath; // xml file path
    private string xmlFileName; // xmlfile name
    private string menuClass; // CSS class to ship the menu
    private string menuId;  // main div id that will surround menu
    //  will menu show selected link differently?
    private bool useDiffCssForCrrntItem = false;       
    private string currentItemClass; //currently selected item's class
    private string currentItemId; //id that will determine which item is selected

    #endregion

    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("")]
    [Localizable(true)]
    #region 4 Member properties Used as Design-Time Attributes for 
        Our Server Control

    public string XmlPath { get { return xmlPath; } set { xmlPath = value; } }
    public string XmlFileName { get { return xmlFileName; } 
    set { xmlFileName = value; } }
    public string MenuClass { get { return menuClass; } 
        set { menuClass = value; } }
    public string MenuId { get { return menuId; } 
        set { menuId = value; } }
    public bool UseDiffCssForCrrntItem { get { return useDiffCssForCrrntItem; } 
        set { useDiffCssForCrrntItem = value; } }
    public string CurrentItemClass { get { return currentItemClass; } 
        set { currentItemClass = value; } }
    public string CurrentItemId { get { return currentItemId; } 
        set { currentItemId = value; } }
    #endregion

    //render method. THIS IS MAIN METHOD WHERE ALL THE HTML CODE IS GENERATED AND
    //PASSED TO HTML PAGE

    protected override void RenderContents(HtmlTextWriter output)
    {
        try
        {
            // make instance from Data Class
            xmlreader myData = new xmlreader();
            //Write menu div
            output.Write("<div class='" + menuClass + 
            "' id='" + menuId + "'>");
            //Open Ul Tag
            output.Write("<ul>");
            //write the Links Tag which is returned by GetNew(connectionStr) Method
            //menuHtmlGenerator method is explained below
            output.Write(menuHtmlGenerator(myData.getMenu(xmlPath, xmlFileName)));
            //ul Close Tag
            output.Write("</ul>");
            //div Close Tags
            output.Write("</d i v></div>");
        }
        catch (Exception ex)
        {
            output.Write(ex);
        }
    }

在 Visual Studio 中构建项目后,右键单击工具箱的标题,然后单击“选择项”,并从 bin 文件夹中选择 DLL 文件。

NavigationMenu/menu2.jpg

之后,将新项目拖放到页面上。设置属性。准备示例项目中的 XML 文件。

关注点

此菜单控件是您可以使用服务器控件所能做的事情的一个示例。它们功能强大且速度快。

历史

  • 2008 年 8 月 8 日:初始版本
© . All rights reserved.