【问题标题】:Multiple root node in asp.net SiteMapPath (Web.sitemap)asp.net SiteMapPath(Web.sitemap)中的多个根节点
【发布时间】:2013-02-01 04:54:33
【问题描述】:

我正在实现一种仪表板类型的 Web 应用程序,其中用户具有不同的角色。当用户浏览仪表板内的不同页面时,我必须在页面顶部显示站点地图路径。我正在使用 asp.net SiteMapPath,如何将它用于多个根节点。我需要根据用户角色实现多个根节点。

例如:- Admin->Directory1->Directory2->Page1.aspx

Teacher->Directory1->Page2.aspx

Student->Directory2->Page1.aspx 等等。

其中 Admin、Teacher 和 Student 是路径的根节点。

它不应该像Admin->Teacher->Directory1->Page2.aspx

有什么解决办法吗?

谢谢。

【问题讨论】:

    标签: asp.net sitemap sitemappath web.sitemap


    【解决方案1】:

    您可以使用管理员作为您的根节点,并在asp:Menu 中定义所有内容, 在你的情况下,使用<asp:Menu ID="mainMenu" DataSourceId="siteMapDataSource" runat="server" StaticDisplayLevels="2" StaticSubMenuIndent="0" /> StaticDisplayLevels="2" 将确保始终显示 admin、teacher 和 student,并且缩进将防止其出现缩进,这是默认定义的。

    【讨论】:

    • 我将 Admin 添加为根节点,但它使教师和学生成为这个的孩子,我不需要。
    • 如果“幕后”管理员是老师和学生的家长,对您来说是否重要?我建议的是他们的父母,但是,在菜单控件中,您将 StaticDisplayLevel 设置为 2,从而定义始终,所有 3 都将呈现在同一级别
    • @ShaharB 如果我不使用 asp.net 菜单控件而是使用 ul 和 li 创建自己的菜单会怎样。
    【解决方案2】:
    • 三个站点地图文件(适用于管理员、教师、学生) 我们已将这些站点地图文件放入 App_Data 文件夹中, 在用户控件中,我们创建一个公共枚举,以表示可用的不同菜单。

      public enum SiteMapMenus  
      

      { Admin, Teacher, Student , NotSet }

      • 然后创建了一个公共属性来在设计时设置菜单类型。
    SiteMapMenus eMenuToLoad = SiteMapMenus.NotSet;  
    public SiteMapMenus MenuToLoad  
    {  
        get { return eMenuToLoad; }  
        set { eMenuToLoad = value; }  
    }  
    
    • 现在,GetMenuDataSource 方法将所需的站点地图文件作为 XML 文件读取,然后创建并返回可以绑定到控件的数据源。

      XmlDataSource GetMenuDataSource(SiteMapMenus menu, string serverMapPath)  
      {  
          XmlDataSource objData = new XmlDataSource();  
          objData.XPath = "siteMap/siteMapNode";  
         switch (menu)  
         {  
      case SiteMapMenus.Admin:objData.DataFile=serverMapPath + @"\App_Data\Admin.sitemap";  
              break;  
          case SiteMapMenus.Teacher:
      objData.DataFile=serverMapPath+@"\App_Data\Teacher.sitemap";  
                       break;  
                  case SiteMapMenus.Student:
      objData.DataFile=serverMapPath+@"\App_Data\Student.sitemap";  
                      break;  
          default:  
              break;  
      }  
      objData.DataBind();  
      return objData;  
      }  
      
    • 由于数据源现在是 XML,而不是从站点地图提供程序返回的格式,我们需要在菜单控件本身上设置数据绑定。

        <asp:Menu ID="Menu1" runat="server">     
     <DataBindings>   
             <asp:MenuItemBinding DataMember="siteMapNode" 
             TextField="title" NavigateUrlField="url"  />   
        </DataBindings>   
     </asp:Menu>  
    
    • 我们现在终于可以将源绑定到控件了,这一切都在用户控件的 Page_Load 事件处理程序中触发。

      protected void Page_Load(object sender, EventArgs e)  
        {  
           Menu1.DataSource = GetMenuDataSource(eMenuToLoad, 
                              Server.MapPath("~"));  
           Menu1.DataBind();  
        }  
      
    • 现在使用我们的新菜单就像在页面上注册用户控件并通过设置 MenuToLoad 属性指定要显示的菜单一样简单。

         <DW:MyMenu ID="MyMenu1" runat="server" MenuToLoad="Secure" />
      

    现在,您可以为不同的用户使用不同的站点地图.....

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多