【问题标题】:Nested CMS.Repeater not returning the DocumentName property value correctly嵌套 CMS.Repeater 未正确返回 DocumentName 属性值
【发布时间】:2015-01-15 08:02:41
【问题描述】:

我已经实现了 Web 部件以支持嵌套中继器,以便使用 kentico 8 实现大型菜单

我所做的是在 Web 部件中的转发器之后创建的

<div>
    <cms:CMSRepeater ID="CMSRepeater6" runat="server" Path="/%" ClassNames="CMS.MenuItem" OrderBy="NodeOrder" WhereCondition="DocumentMenuItemHideInNavigation = 0 AND Published = 1 AND MenuItemGroup='Top'" MaxRelativeLevel="1" DelayedLoading="true"  OnItemDataBound="CMSRepeater6_ItemDataBound" >
        <ItemTemplate>
            <div>
                <li>
                    <h3><a href="<%# Eval("NodeAliasPath")%>"><%# Eval("DocumentName")%></a></h3>
                </li>
            </div>
            <cms:CMSRepeater ID="repMegaMenuLevel1" runat="server" Path="/%" ClassNames="CMS.MenuItem" OrderBy="NodeOrder">
                 <ItemTemplate>
                </ItemTemplate>
            </cms:CMSRepeater>
        </ItemTemplate>
    </cms:CMSRepeater>
</div>

并尝试在代码级别绑定转换

protected void CMSRepeater6_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
        {
            var dr = item.DataItem as DataRowView;
            string menuType = dr["MenuItemType"].ToString();

            if (!string.IsNullOrEmpty(menuType))
            {
               var rptMegaMenuItem = item.FindControl("repMegaMenuLevel1") as CMSRepeater;

                if (menuType.Equals("1"))
                {
                    rptMegaMenuItem.TransformationName = "Content.PageProductCategory.MagaMenu11";
                    rptMegaMenuItem.WhereCondition = "MenuItemType = 1 AND MenuItemGroup='Top' AND DocumentMenuItemHideInNavigation = 0 ";
                    rptMegaMenuItem.NestedControlsID = "repMegaMenuLevel3";
                    rptMegaMenuItem.DelayedLoading = true;

                }

            }

        }
    }

转换代码:

<cms:CMSRepeater ID="repMegaMenuLevel3" runat="server" DataBindByDefault="false" EnableViewState="false" ClassNames="Content.PageProductCategory;CMS.MenuItem" MaxRelativeLevel="1" Path="/What-we-do/%">
    <ItemTemplate>
        <li><%# Eval("DocumentName")%></li> 
        <li><%# Eval("DocumentNamePath")%></li>
      <li><%# Eval("ClassName")%></li>
    </ItemTemplate>
</cms:CMSRepeater>
<script runat="server">
  protected override void OnInit(EventArgs e) {
    repMegaMenuLevel3.Path = "/What-we-do/%";
    repMegaMenuLevel3.ClassNames="Content.PageProductCategory";
    repMegaMenuLevel3.ReloadData(true);  
  }
</script>

问题是中继器 repMegaMenuLevel3 总是返回文档名称作为父级 (CMS.MenuItem) DocumentName 即“我们做什么”而不是来自 content.PageProductCategory,我尝试以不同的方式设置路径,但没有运气

【问题讨论】:

    标签: c# kentico


    【解决方案1】:

    我感觉你不必要地设置了太多属性:)

    1. 正确使用 NestedControlsID - 当父控件设置它时避免在子控件上设置路径。
    2. 同时避免在子控件上调用 ReloadData(true) - 父控件会为您执行此操作
    3. 整合 ClassNames 的使用(我建议仅在 ASPX 标记中设置它)
    4. 摆脱自定义 _ItemDataBound - 尝试将您的代码移动到转换中

    如果您想尝试不同的方法,我建议您使用分层转换。

    资源:

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多