都知道有站点地图文件和XML文件的支持,不知首如何读取地图文件和XML文件,并修改,从而改变menu,请高手指点,最好有代码,非常感谢.

解决方案 »

  1.   

    偶也不是完全清楚,慢慢讲吧:Menu控件可以绑定SiteMapDataSource和XmlDataSource先说SiteMapDataSource,他默认通过SiteMapProvider读取站点根目录下Web.sitemap作为数据源,或者,可以实现自己的站点地图提供程序,通过修改SiteMapDataSouce的SiteMapProvider属性使用自定义的提供程序。创建自定义站点地图提供程序的三个主要理由如下:
    1。为了将站点地图信息存储在 ASP.NET 默认站点地图提供程序不支持的数据源中。例如,您可能希望将站点地图数据存储在 Visual FoxPro 数据库、Oracle 数据库或其他数据源中。
    2。为了使用与 Web.sitemap 文件所使用的架构不同的架构来管理导航信息。例如,您可能拥有一个用于存储站点地图数据的现有实现。
    3。为了使用动态站点地图结构。例如,您可能希望每个客户端帐户能够查看不同的站点地图。演示一个完整的基于 Access 的站点地图提供程序:
    namespace Samples.AspNet.CS.Controls {    using System;
        using System.Collections;
        using System.Collections.Specialized;
        using System.Data;
        using System.Data.OleDb;
        using System.Security.Permissions;
        using System.Web;    /// An extremely simple AccessSiteMapProvider that only supports a
        /// site map node hierarchy 1 level deep.
        [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)]
        public class AccessSiteMapProvider : StaticSiteMapProvider
        {
            private SiteMapNode rootNode =  null;
            private OleDbConnection accessConnection = null;        // This string is case sensitive.
            private string AccessConnectionStringName = "accessSiteMapConnectionString";        // Implement a default constructor.
            public AccessSiteMapProvider () { }        // Some basic state to help track the initialization state of the provider.
            private bool initialized = false;
            public virtual bool IsInitialized {
                get {
                    return initialized;
                }
            }
            // Return the root node of the current site map.
            public override SiteMapNode RootNode {
                get {
                    SiteMapNode temp = null;
                    temp = BuildSiteMap();
                    return temp;
                }
            }
            protected override SiteMapNode GetRootNodeCore() {
                return RootNode;
            }
            // Initialize is used to initialize the properties and any state that the
            // AccessProvider holds, but is not used to build the site map.
            // The site map is built when the BuildSiteMap method is called.
            public override void Initialize(string name, NameValueCollection attributes) {
                if (IsInitialized)
                    return;            base.Initialize(name, attributes);            // Create and test the connection to the Microsoft Access database.            // Retrieve the Value of the Access connection string from the
                // attributes NameValueCollection.
                string connectionString = attributes[AccessConnectionStringName];            if (null == connectionString || connectionString.Length == 0)
                    throw new Exception ("The connection string was not found.");
                else
                    accessConnection = new OleDbConnection(connectionString);            initialized = true;
            }        ///
            /// SiteMapProvider and StaticSiteMapProvider methods that this derived class must override.
            ///
            // Clean up any collections or other state that an instance of this may hold.
            protected override void Clear() {
                lock (this) {
                    rootNode = null;
                    base.Clear();
                }
            }        // Build an in-memory representation from persistent
            // storage, and return the root node of the site map.
            public override SiteMapNode BuildSiteMap() {            // Since the SiteMap class is static, make sure that it is
                // not modified while the site map is built.
                lock(this) {                // If there is no initialization, this method is being
                    // called out of order.
                    if (! IsInitialized) {
                        throw new Exception("BuildSiteMap called incorrectly.");
                    }                // If there is no root node, then there is no site map.
                    if (null == rootNode) {
                        // Start with a clean slate
                        Clear();                    // Select the root node of the site map from Microsoft Access.
                        int rootNodeId = -1;                    if (accessConnection.State == ConnectionState.Closed)
                            accessConnection.Open();
                        OleDbCommand rootNodeCommand =
                            new OleDbCommand("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid IS NULL",
                                             accessConnection);
                        OleDbDataReader rootNodeReader = rootNodeCommand.ExecuteReader();                    if(rootNodeReader.HasRows) {
                            rootNodeReader.Read();
                            rootNodeId = rootNodeReader.GetInt32(0);
                            // Create a SiteMapNode that references the current StaticSiteMapProvider.
                            rootNode   = new SiteMapNode(this,
                                                         rootNodeId.ToString(),
                                                         rootNodeReader.GetString(1),
                                                         rootNodeReader.GetString(2));                    }
                        else return null;                    rootNodeReader.Close();
                        // Select the child nodes of the root node.
                        OleDbCommand childNodesCommand =
                            new OleDbCommand("SELECT nodeid, url, name FROM SiteMap WHERE parentnodeid = ?",
                                             accessConnection);
                        OleDbParameter rootParam = new OleDbParameter("parentid", OleDbType.Integer);
                        rootParam.Value = rootNodeId;
                        childNodesCommand.Parameters.Add(rootParam);                    OleDbDataReader childNodesReader = childNodesCommand.ExecuteReader();                    if (childNodesReader.HasRows) {                        SiteMapNode childNode = null;
                            while(childNodesReader.Read()) {
                                childNode =  new SiteMapNode(this,
                                                             childNodesReader.GetInt32(0).ToString(),
                                                             childNodesReader.GetString(1),
                                                             childNodesReader.GetString(2));                            // Use the SiteMapNode AddNode method to add
                                // the SiteMapNode to the ChildNodes collection.
                                AddNode(childNode, rootNode);
                            }
                        }                    childNodesReader.Close();
                        accessConnection.Close();
                    }
                    return rootNode;
                }
            }
        }
    }
      

  2.   

    上面讲的是“创建自定义站点地图提供程序”,比较麻烦,我们多数不需要,但可能会需要使用多个站点地图文件,这比较简单,先在web.config里设置:.....
        <siteMap defaultProvider="XmlSiteMapProvider">
          <providers>
            <add 
              name="Company1SiteMap"
              type="System.Web.XmlSiteMapProvider" 
              siteMapFile="~/Company1/Company1.sitemap" />
            <add 
              name="Company2SiteMap"
              type="System.Web.XmlSiteMapProvider" 
              siteMapFile="~/Company2/Company2.sitemap" />
          </providers>
        </siteMap>
    </system.web>然后,将SiteMapDataSource的SiteMapProvider属性设置为 Company1SiteMap 或 Company2SiteMap就可以使用了。
      

  3.   

    SiteMapDataSouce绑定到menu后,通过对menu的编程访问,还可以动态创建菜单,填充菜单项,设置属性。这个话题就不啰嗦了,查查帮助,看看menu控件有哪些方法和属性就好了。
    =================================================================Menu控件可以绑定XmlDataSource,XmlDataSource用起来也是比较简单的,xml和xsl结合在一起,就成为数据源,只需要选择正确的文件路径就行了~~~
      

  4.   

    PS: 看来现在这里用asp.net2.0的人还是不多,lz的100分帖子,居然放了6小时又40分钟都没人回......