2

嗨,我创建了一个服务器控件,它由 以下所有六个页面组成<UL> , 我只想在 下面的所有六个页面中重用我的菜单是控件代码 Asp 代码<LI>


<%@ 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>我点击哪个,只能通过服务器端

我已经在 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");
    }
4

3 回答 3

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;
            }
        }
    }
于 2013-04-23T12:19:50.260 回答
1

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

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

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

protected void Page_Load(object sender, EventArgs e)
{
    if (Parent.Page.Title == "My Title")
    {
    }
于 2013-04-22T13:46:22.943 回答
0

或者您可以通过任何一种方式检查您的浏览器的 URL 并在您的菜单中进行选择

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;
}
于 2013-04-24T05:42:47.293 回答