0

次のようなSitecore(sc:Link)を使用してタブリンクを動的に生成するリピーターがあります。

<asp:Repeater ID="rptTab" runat="server" OnItemDataBound="rptTab_ItemBound">
            <ItemTemplate>
                <li id= "liTabTest" runat = "server" class="tab-label">
                    <asp:HyperLink onclick = "javascript: TabClick(this)" runat="server" id="aLink">
                        <sc:Link ID="hlTabLink" Field="scTabLink" runat="server" ></sc:Link>
                    </asp:HyperLink>
                </li>
            </ItemTemplate>
       </asp:Repeater>

私はJSを介してCSSを操作します:

var loadURL;
$(document).ready(function () {
    init();
});

function init() {
     $("ul#Tab-labels li:first").addClass("TabbedPanelsTabSelected");
  };

  function TabClick(obj) {
      $("ul#Tab-labels li").removeClass("TabbedPanelsTabSelected");
      $(obj).addClass("TabbedPanelsTabSelected");

 };

残念ながら、各タブは個別の.ASPXページであるため、これは機能しません。そのため、ページが再度レンダリングされます。そのため、JSのInit()が呼び出され、CSSが毎回最初のアイテムに対して実行されます。

これは私の背後にあるコードです:

        protected void rptTab_ItemBound(Object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Item i = e.Item.DataItem as Item;
            Link hlTabLink = e.Item.FindControl("hlTabLink") as Link;
            hlTabLink.DataSource = i.Paths.FullPath;
            hlTabLink.Field = "Title";
            HyperLink aLink = e.Item.FindControl("aLink") as HyperLink;
            aLink.NavigateUrl = Sitecore.Links.LinkManager.GetItemUrl(i);
        }
    }

コードビハインドでCSSを追加しようとしましたが、タブのインデックス(どのタブが選択されているか)を取得できないため、機能しませんでした。どんな解決策もありがたいです!ありがとう!

4

2 に答える 2

7

コード ビハインドでより適切に (そしてより簡単に) 達成できるタスクには、javascript を実行しないでください。Sitecore.Context.Item がタブの名前と一致するリピーター アイテムのアクティブ クラスを設定するだけです。ItemDataBound 内の疑似コード:

if(i == Sitecore.Context.Item)
{
    HtmlGenericControl li = e.Item.FindControl("liTabTest");
    li.Attributes.Add("class","TabPanelTabbedSelected");
}

ここで HtmlGenericControl が正しいかどうか、または CssClass プロパティがあるかどうかはわかりませんが、理解していただければ幸いです。サーバー側に li の直接表現がない場合は、文字列リテラルをバインドするか、Literal コントロールを使用することもできます。

于 2012-07-24T18:48:12.783 に答える
0

私の質問に対する答えは次のとおりです。リピーターは配列のようなものです。したがって、次のようにリピーターの最初と最後の要素を取得できます。

string currClass =  hc.Attributes["class"].ToString();
string count = e.Item.Controls.Count.ToString();
        if (e.Item.ItemIndex == 0)
                    {
                        currClass += " TabbedPanelsTabSelected";
                    }
     else if (e.Item.ItemIndex.ToString() == count)
                    {
                        currClass += " last";
                    }

このようにして、Repeater を介して最初の要素と最後の要素に css を追加できます。

于 2012-07-26T22:14:50.150 に答える