在asp.net 3.5母版页中高亮显示当前页面

时间:2011-02-11 13:50:01

标签: c# .net asp.net

在我的项目中,母版页包含一个转发器,该转发器用作菜单,其中Xml文件作为转发器的数据源。

<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>

xml文件中的url为

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

这里我想更改菜单中当前页面的CSS样式。

3 个答案:

答案 0 :(得分:2)

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

在.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");
        }
    }
}

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

答案 1 :(得分:1)

也许一种解决方案是检查内联Eval代码中的当前页面并将“currentpage”类添加到锚点

为简单起见,我使用的是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>

答案 2 :(得分:0)

不是直接从xml数据绑定到转发器,而是尝试获取转发器数据处理事件,并与当前页面URL和每个绑定项进行比较,以确定当前项目是否应该高亮显示