Creare un menu con il controllo Repeater

Da un'altra richiesta su NG :-D, dovrò creare un angolo dedicato, forse in articoli :-), un problema semplice ma non molto per chi è all'inizio: come creare un menu con il controllo Repeater.

Questo esempio parte dal presupposto di avere la struttura delle pagine in uno storage (DB), per questo sarebbe più corretto implementare un SiteMapProvider, come questo.

Per semplificare però eseguo il binding direttamente con un ObjectDataSource.

Il codice html della pagina:

   1:  <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetAll" TypeName="SectionsDataSource" />        
   2:  <asp:Repeater ID="rptMenu" runat="server" OnItemDataBound="rptMenu_ItemDataBound" DataSourceID="ObjectDataSource1">
   3:      <HeaderTemplate><ul></HeaderTemplate>
   4:      <ItemTemplate><li><asp:HyperLink ID="hypSection" runat="server" 
   5:      NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "Url") %>' 
   6:      Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' /></li>
   7:      </ItemTemplate>
   8:      <FooterTemplate></ul></FooterTemplate>
   9:  </asp:Repeater>

Il code-behind:
   1:  protected void rptMenu_ItemDataBound(object sender, RepeaterItemEventArgs e)
   2:  {
   3:      if ((!e.Item.ItemType.Equals(ListItemType.Item)) 
   4:          && (!e.Item.ItemType.Equals(ListItemType.AlternatingItem)))
   5:          return;
   6:   
   7:      Section section = e.Item.DataItem as Section;
   8:      HyperLink hypSection = e.Item.FindControl("hypSection") as HyperLink;
   9:   
  10:      string virtualPath = VirtualPathUtility.ToAppRelative(Request.Path).ToLower();
  11:      
  12:      //Check if the current item url is the current section
  13:      if (section.Url.Equals(virtualPath, StringComparison.InvariantCultureIgnoreCase)) {
  14:          hypSection.NavigateUrl = string.Empty;
  15:          hypSection.CssClass = "currentSection";
  16:      }
  17:  }

La classe Section:
   1:  public class Section
   2:  {
   3:      public Section(string name, string url) {
   4:          this.name = name;
   5:          this.url = url;
   6:      }
   7:   
   8:      string name;
   9:      public string Name
  10:      {
  11:          get { return name; }
  12:          set { name = value; }
  13:      }
  14:      
  15:      string url;
  16:      public string Url
  17:      {
  18:          get { return url; }
  19:          set { url = value; }
  20:      }
  21:  }

Ed infine il data source:
   1:  public class SectionsDataSource
   2:  {
   3:      public IList<Section> GetAll() {
   4:          List<Section> sections = new List<Section>();
   5:          sections.Add(new Section("Home", "~/default.aspx"));
   6:          sections.Add(new Section("Contacts", "~/contacts.aspx"));
   7:          sections.Add(new Section("Where", "~/where.aspx"));
   8:          return sections;
   9:      }    
  10:  }
Qui si trova il codice dell'esempio. Matteo Migliore.
Add Comment Filed Under [ ASP.NET ]
Comments have been closed on this topic.