2011-02-11 77 views
2

在我的项目中,母版页包含一个中继器,该中继器用作带有Xml文件的菜单作为中继器的数据源。在asp.net 3.5母版页中打开当前页面

<asp:Repeater ID="Admin_menus" runat="server"> 
    <HeaderTemplate><div id="navmenu"><ul></HeaderTemplate> 
    <FooterTemplate>|</ul></div></FooterTemplate> 
    <ItemTemplate> 
     |<li> 
     <a href="<%# DataBinder.Eval(Container.DataItem, "url")%>" 
      class="link6" id="<%# DataBinder.Eval(Container.DataItem, "id")%>"> 
       <strong> 
        <%# DataBinder.Eval(Container.DataItem, "title")%> 
       </strong> 
     </a> 
     </li> 
    </ItemTemplate> 
</asp:Repeater> 

的URL在XML文件是

<menuitems> 
    <item id="1" url="Employee.aspx" title="Employee" description="Employee" /> 
    <item id="2" url="Location.aspx" title="Location" description="Location" /> 
</menuitems> 

在这里,我想改变当前页面的CSS样式的菜单。

+0

为什么不使用站点地图提供程序。 – 2011-02-11 14:02:26

回答

2

您可以选择的一种解决方案是处理<asp:Repeater>控件的ItemCreated事件。要做到这一点,你需要添加一个事件处理程序:

在的.master标记:

<asp:Repeater ID="Admin_menus" runat="server" OnItemCreated="Admin_menus_ItemCreated"> 
     <HeaderTemplate> 
      <div id="navmenu"> 
       <ul> 
     </HeaderTemplate> 
     <FooterTemplate> 
      |</ul></div></FooterTemplate> 
     <ItemTemplate> 
      |<li runat="server" id="hyperlink"><a href="<%# DataBinder.Eval(Container.DataItem, "url")%>" class="link6" id="<%# DataBinder.Eval(Container.DataItem, "id")%>"> 
       <strong> 
        <%# DataBinder.Eval(Container.DataItem, "title")%></strong> </a></li> 
     </ItemTemplate> 
    </asp:Repeater> 

在.master.cs代码隐藏:

protected void Admin_menus_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    // Ensure that the ItemCreated is not null, the first one (header?) gets 
    // returned null 
    if (e.Item.DataItem != null) 
    { 
     // Extract the "url" attribute from the Xml that's being used for 
     // databinding for this particular row, via casting it down to 
     // IXPathNavigable as the concrete type of e.Item.DataItem isn't available 
     // to us. 
     var currentUrl = ((IXPathNavigable)e.Item.DataItem).CreateNavigator().GetAttribute("url", ""); 

     if (Request.Url.PathAndQuery.Contains(currentUrl)) 
     { 
      // This just adds a background color of "red" to the selected 
      // menu item. What you actually do is entirely up to you     
      var hyperlink = (HtmlGenericControl) e.Item.FindControl("hyperlink"); 
      hyperlink.Style.Add(HtmlTextWriterStyle.BackgroundColor, "red"); 
     } 
    } 
} 

请注意,我添加了一个runat="server"以及id="hyperlink"到您的ItemTemplate中的<li>标记,以便ItemCreated处理程序中的代码可以轻松找到它的样式。

+0

嗨,谢谢Rob.the代码现在工作正常。 – 2011-02-11 15:56:07

0

,而不是直接从你的XML数据中继器结合,试图让中继databing事件,并与当前页面的URL和各结合项目进行比较,以确定当前项目应该是喜亮

1

也许一个解决办法是检查你的在线评估和演示代码当前页面并添加“当前页”类锚

对于我使用的eval(简单)而不是的DataBinder.Eval()

<asp:Repeater ID="Admin_menus" runat="server"> 
    <HeaderTemplate> 
     <div id="navmenu"><ul> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <li> 
      <a href='<%# Eval("url") %>' class='link6<%# Request.RawUrl.EndsWith(Eval("url").ToString()) ? " currentpage" : "" %>' id='<%# Eval("id")%>'><strong><%# Eval("title")%></strong></a> 
     </li> 
    </ItemTemplate> 
    <FooterTemplate> 
     </ul></div> 
    </FooterTemplate> 
</asp:Repeater>