2011-02-11 78 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>