1

页面上有两个不同的导航菜单,它们各自独立的用户控件。两个菜单中的菜单项可以导航到相同的页面。顶部菜单有一些 jQuery 动画,而左侧菜单没有。

问题是当锚标记在转发器中并且转发器在用户控件中(锚标记是动态创建的)时,如何获取导航菜单中的哪个锚标记进行了回发。问题是顶部菜单用户控件代码隐藏运行并为隐藏字段设置了一些值,因此 jQuery 动画将为顶部菜单正确运行,但是当单击左侧菜单时,它不应该运行并在顶部菜单代码隐藏中设置隐藏字段。所以我需要弄清楚如何区分这两个菜单。

这是中继器标记:

<asp:Repeater runat="server" ID="RightSide">
        <HeaderTemplate><ul></HeaderTemplate>
        <ItemTemplate>
            <li data-type="<%# ((Item)Container.DataItem).HasChildren ? "dropdown" : "link" %>" class="<%# ((Item)Container.DataItem).HasChildren ? "dropdown" : "link" %>">
                <a href='<%# GetLink(((Item)Container.DataItem),"MenuLink") %>'><%#((Item)Container.DataItem)["MenuTitle"] %></a>
            </li>
        </ItemTemplate>
        <FooterTemplate></ul></FooterTemplate>
    </asp:Repeater>

TopMenu .cs 代码:

public partial class TopMenu
{
    private ID _homeId = new ID("{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}");

    protected void Page_Load(object sender, EventArgs e)
    {
        RightSide.DataSource = GetMultiList("Right side", RootItem);
        RightSide.DataBind();

        ***HERE I NEED TO MAKE THE CHECK.
        So the code below should only run if the postback came from the topmenu***

        var sectionItem = GetAncestorOrDefault(CurrentItem);

        Sitecore.Data.Database context = Sitecore.Context.Database;
        Sitecore.Data.Items.Item homeItem = context.GetItem("/sitecore/content/home");

        List<Item> items = new List<Item>();
        Sitecore.Data.Fields.MultilistField multilistField = homeItem.Fields["Right Side"];

        foreach (string id in multilistField)
        {
            Sitecore.Data.Items.Item multiItem = Sitecore.Context.Database.Items.GetItem(id);

            if (multiItem.HasChildren)
            {
                items.Add(multiItem);
            }
        }

        foreach (Item item in items)
        {
            if (item.Name.Equals(sectionItem.Name))
            {
                hiddenAttr.Value = sectionItem.Name;
                break;
            }
            else
            {
                hiddenAttr.Value = String.Empty;
            }
        }
    }
}

我尝试过使用 eventtarget,但它始终为空,并且隐藏字段的值在代码隐藏中始终为“”。我没主意了...

如果需要,我会发布更多代码。

提前致谢!

厄瓦尔

4

1 回答 1

1

您正在覆盖回发中的所有值。将代码包装在 if(!IsPostBack){} 中以进行转发器数据绑定:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        RightSide.DataSource = GetMultiList("Right side", RootItem);
        RightSide.DataBind();
    }
    else
    {   
     // ***HERE I NEED TO MAKE THE CHECK.
        // So the code below should only run if the postback came from the topmenu***

        var sectionItem = GetAncestorOrDefault(CurrentItem);

        Sitecore.Data.Database context = Sitecore.Context.Database;
        Sitecore.Data.Items.Item homeItem = context.GetItem("/sitecore/content/home");

        List<Item> items = new List<Item>();
        Sitecore.Data.Fields.MultilistField multilistField = homeItem.Fields["Right Side"];

        foreach (string id in multilistField)
        {
            Sitecore.Data.Items.Item multiItem = Sitecore.Context.Database.Items.GetItem(id);

            if (multiItem.HasChildren)
            {
                items.Add(multiItem);
            }
        }

        foreach (Item item in items)
        {
            if (item.Name.Equals(sectionItem.Name))
            {
                hiddenAttr.Value = sectionItem.Name;
                break;
            }
            else
            {
                hiddenAttr.Value = String.Empty;
            }
        }
    }
}

另外我建议在标签中使用查询参数。如果 href 是 "/MyContent/MyPgae1" ,您可以将其更改为 "/MyContent/MyPgae1?s=r" 并在回发中:

if (!IsPostBack)
        {
            RightSide.DataSource = GetMultiList("Right side", RootItem);
            RightSide.DataBind();
        }
        else
        {   
            if(Request.QueryString["s"] == "r")
            {
                //request is from rightmenu
            }
于 2013-09-08T17:20:19.070 回答