在自定义控件中从服务器端更改li的类

时间:2013-04-22 13:21:16

标签: asp.net html-lists server-side custom-server-controls

您好我创建了一个服务器控件,其中包含 <UL> 及其 <LI>
我只想在所有六页中重复使用我的菜单
以下是控制代码 Asp代码

<%@ Control Language="C#" ClassName="Menu" %>
     <ul id="ulSideBar" class="nav nav-list" runat="server">
                <li accesskey="1" id="liDefault" runat="server" **class="active"**>
                    <asp:LinkButton runat="server" ID="lnkDefault" OnClick="lnkDefault_Click">Introduction</asp:LinkButton></li>
                <li accesskey="2" id="liSquad" runat="server">
                    <asp:LinkButton runat="server" ID="lnkSquad" OnClick="lnkSquad_Click">Squad</asp:LinkButton>
                </li>
                <li accesskey="3" id="liGallery" runat="server">
                    <asp:LinkButton runat="server" ID="lnkGallery" OnClick="lnkGallery_Click">Gallery</asp:LinkButton>
                </li>
                <li accesskey="4" id="liMatches" runat="server">
                    <asp:LinkButton runat="server" ID="lnkMatches" OnClick="lnkMatches_Click">Matches</asp:LinkButton>
                </li>
                <li accesskey="5" id="liActivities" runat="server">
                    <asp:LinkButton runat="server" ID="lnkActivities" OnClick="lnkActivities_Click">Activities</asp:LinkButton>
                </li>
                <li accesskey="6" id="liNewsFeed" runat="server">
                    <asp:LinkButton runat="server" ID="lnkNewsFeed" OnClick="lnkNewsFeed_Click">News Feed</asp:LinkButton>
                </li>
            </ul>

我在六页中使用此控件现在我的问题是如何更改 class = active ,无论哪个 <li> 我点击,只能通过服务器端< / p>

我在Control的代码隐藏中尝试过这段代码,但它无效

 protected void lnkDefault_Click(object sender, EventArgs e)
    {
        liDefault.Attributes.Add("class", "active");
        liSquad.Attributes.Remove("class");
        liGallery.Attributes.Remove("class");
        liMatches.Attributes.Remove("class");
        liActivities.Attributes.Remove("class");
        liNewsFeed.Attributes.Remove("class");
        Response.Redirect("Default.aspx");
    }
    protected void lnkSquad_Click(object sender, EventArgs e)
    {
        liDefault.Attributes.Remove("class");
        liSquad.Attributes.Add("class", "active");
        liGallery.Attributes.Remove("class");
        liMatches.Attributes.Remove("class");
        liActivities.Attributes.Remove("class");
        liNewsFeed.Attributes.Remove("class");
        Response.Redirect("Squad.aspx");
    }
    protected void lnkGallery_Click(object sender, EventArgs e)
    {
        liSquad.Attributes.Remove("class");
        liDefault.Attributes.Remove("class");
        liGallery.Attributes.Add("class", "active");
        liMatches.Attributes.Remove("class");
        liActivities.Attributes.Remove("class");
        liNewsFeed.Attributes.Remove("class");
        Response.Redirect("Gallery.aspx");
    }
    protected void lnkMatches_Click(object sender, EventArgs e)
    {
        liDefault.Attributes.Remove("class");
        liSquad.Attributes.Remove("class");
        liGallery.Attributes.Remove("class");
        liMatches.Attributes.Add("class", "active");
        liActivities.Attributes.Remove("class");
        liNewsFeed.Attributes.Remove("class");
        Response.Redirect("Matches.aspx");
    }
    protected void lnkActivities_Click(object sender, EventArgs e)
    {
        liDefault.Attributes.Remove("class");
        liSquad.Attributes.Remove("class");
        liGallery.Attributes.Remove("class");
        liMatches.Attributes.Remove("class");
        liActivities.Attributes.Add("class", "active");
        liNewsFeed.Attributes.Remove("class");
        Response.Redirect("Activities.aspx");
    }
    protected void lnkNewsFeed_Click(object sender, EventArgs e)
    {
        liDefault.Attributes.Remove("class");
        liSquad.Attributes.Add("class", "active");
        liGallery.Attributes.Remove("class");
        liMatches.Attributes.Remove("class");
        liActivities.Attributes.Remove("class");
        liNewsFeed.Attributes.Add("class", "active");
        Response.Redirect("NewsFeed.aspx");
    }

3 个答案:

答案 0 :(得分:3)

这解决了我的问题。我的问题是我使用的是<ul> <li>的自定义控件,但是使用控件的页面有问题,即当用户点击li时,它应该将其类更改为活动状态(class ='active')但由于回帖,它没有改变 可能如果其他人有这个问题可以使用我的解决方案。我在自定义控件代码隐藏

中使用了这个函数
 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // switch (Parent.TemplateControl.AppRelativeVirtualPath.Replace("~/Teams/", ""))
            switch (System.IO.Path.GetFileName(Page.Request.Path))
            {
                case "Default.aspx":
                    liDefault.Attributes.Add("class", "active");
                    liSquad.Attributes.Remove("class");
                    liGallery.Attributes.Remove("class");
                    liMatches.Attributes.Remove("class");
                    liActivities.Attributes.Remove("class");
                    liNewsFeed.Attributes.Remove("class");
                    break;
                case "Squad.aspx":
                    liDefault.Attributes.Remove("class");
                    liSquad.Attributes.Add("class", "active");
                    liGallery.Attributes.Remove("class");
                    liMatches.Attributes.Remove("class");
                    liActivities.Attributes.Remove("class");
                    liNewsFeed.Attributes.Remove("class");
                    break;
                case "Gallery.aspx":
                    liSquad.Attributes.Remove("class");
                    liDefault.Attributes.Remove("class");
                    liGallery.Attributes.Add("class", "active");
                    liMatches.Attributes.Remove("class");
                    liActivities.Attributes.Remove("class");
                    liNewsFeed.Attributes.Remove("class");
                    break;
                case "Matches.aspx":
                    liDefault.Attributes.Remove("class");
                    liSquad.Attributes.Remove("class");
                    liGallery.Attributes.Remove("class");
                    liMatches.Attributes.Add("class", "active");
                    liActivities.Attributes.Remove("class");
                    liNewsFeed.Attributes.Remove("class");
                    break;
                case "Activities.aspx":
                    liDefault.Attributes.Remove("class");
                    liSquad.Attributes.Remove("class");
                    liGallery.Attributes.Remove("class");
                    liMatches.Attributes.Remove("class");
                    liActivities.Attributes.Add("class", "active");
                    liNewsFeed.Attributes.Remove("class");
                    break;
                case "NewsFeed.aspx":
                    liDefault.Attributes.Remove("class");
                    liSquad.Attributes.Remove("class");
                    liGallery.Attributes.Remove("class");
                    liMatches.Attributes.Remove("class");
                    liActivities.Attributes.Remove("class");
                    liNewsFeed.Attributes.Add("class", "active");
                    break;
            }
        }
    }

答案 1 :(得分:1)

您可能正在更改类属性,但随后您会立即重定向到另一个页面,以便您永远不会看到它。重新加载页面时,更改将丢失。

您可能需要将活动页面存储在会话变量中,然后在控件加载时设置活动类。

[编辑] 如果您希望控件反映它所在的页面,也许您可​​以使用页面标题(或其他页面属性之一):

protected void Page_Load(object sender, EventArgs e)
{
    if (Parent.Page.Title == "My Title")
    {
    }

答案 2 :(得分:0)

或者,您可以选择检查浏览器的网址并在菜单中进行选择

string page = Path.GetFileNameWithoutExtension(Request.AppRelativeCurrentExecutionFilePath);
string pageDirectory = Path.GetDirectoryName(Request.AppRelativeCurrentExecutionFilePath);

string category = Request.QueryString.Count>0 ? Request.QueryString[0] : string.Empty;

switch (category)
{
    case "home":
        lnk_Home.CssClass = "selected";
        break;
}