Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过中继器添加CSS类_C#_Asp.net_.net_Repeater_Sitecore - Fatal编程技术网

C# 通过中继器添加CSS类

C# 通过中继器添加CSS类,c#,asp.net,.net,repeater,sitecore,C#,Asp.net,.net,Repeater,Sitecore,我有一个中继器,它使用Sitecore(sc:Link)动态生成选项卡链接,如下所示: <asp:Repeater ID="rptTab" runat="server" OnItemDataBound="rptTab_ItemBound"> <ItemTemplate> <li id= "liTabTest" runat = "server" class="tab-label">

我有一个中继器,它使用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>
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";
                    }

不幸的是,这不起作用,因为每个选项卡都是一个单独的.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,但没有成功,因为我无法获取选项卡的索引(正在选择哪个选项卡)。任何解决方案都将不胜感激!谢谢

不要为更好(更容易)在代码隐藏中完成的任务运行javascript。只需为repeater项设置活动类,其中Sitecore.Context.item与选项卡名称匹配。ItemDataBound中的伪代码:

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

我不确定HtmlGenericControl在这里是否正确,或者它是否具有CssClass属性,但我希望您能理解。如果服务器端没有li的直接表示,您也可以绑定字符串文字或使用文字控件。

我的问题的答案是:中继器就像一个数组。因此,我可以得到中继器的第一个和最后一个元素,如下所示:

<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>
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

“每个选项卡都是一个单独的.ASPX页面”:你的意思是你正在使用IFRAME吗?不,它是通过Sitecore实现的。所以Tab1是:Welcome.aspx。它就像一个使用占位符的容器。Tab2可能是:Welcome1.aspx.li.Attributes.Add(“class”,“CSSName”);是的,那是票。更新了代码示例。但是,请注意,如果有回发,这种情况可能不会持续。还有其他解决办法吗?选项卡完全不同。aspx页。您仍然可以使用此解决方案,只需在ViewState中保存/恢复额外属性或在回发时使用其他机制即可。@RD-3此结构中的“hc”代表什么?