1

ページ上の 2 つの異なるナビゲーション メニューが、それぞれ別のユーザー コントロールにあります。2 つのメニューのメニュー項目は、同じページに移動できます。トップメニューにはいくつかの jQuery アニメーションがあり、左メニューにはありません。

問題は、アンカータグがリピーターにあり、リピーターがユーザーコントロールにある場合に、ナビゲーションメニューのどのアンカータグがポストバックを作成したかをどのように取得できるかです(アンカータグは動的に作成されます)。問題は、トップメニューのユーザーコントロールのコードビハインドが実行され、hiddenfields のいくつかの値が設定されるため、jQuery アニメーションはトップメニューに対して適切に実行されますが、左メニューがクリックされたときに実行されず、トップメニューのコードビハインドで隠しフィールドが設定されます。そのため、2 つのメニューを区別する方法を理解する必要があります。

リピーターのマークアップは次のとおりです。

<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 を試しましたが、それは常に null であり、コードビハインドでは値が常に "" である非表示フィールドでもあります。私はアイデアがありません...

必要に応じて、さらにコードを投稿します。

前もって感謝します!

オルヴァル

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 が である場合は 、 postback に"/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 に答える