代码之家  ›  专栏  ›  技术社区  ›  Colin

在另一个Web部件中嵌套Web部件

  •  0
  • Colin  · 技术社区  · 8 年前

    是否有人知道在Kentico CMS中是否有方法将一个Web部件嵌套到另一个Web部件中我做了一个小调查,我没有看到很多关于这个话题的结果,所以似乎简短的答案是不,但也许有一个解决办法?在我正在进行的项目中,要求内容作者能够在页面上放置汉堡包菜单,然后通过拖放在汉堡包菜单中添加其他内容。如何在肯迪科实现这一点?

    谢谢。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Brenden Kehren    8 年前

    通常,web部件由用户控件组成,而不是嵌套web部件。例如,看看cmsrepeater。它设置由Kentico创建的用户控件的属性。

    对于您正在解释的内容,似乎您需要一个包含小部件区域的自定义web部件这些小部件区域将允许您在适当的位置拖放内容(我不知道什么内容,因为您不能在kentico中拖放内容,只有区域/小部件)。

    对于导航,您可能希望根据内容树创建它,但在您的情况下,可能汉堡菜单不用于导航。

        2
  •  0
  •   Colin    8 年前

    解决方案是在web部件中添加一个小部件区域。

        3
  •  0
  •   Colin    8 年前

    绕回这根柱子尽管添加了 <cms:CMSEditableRegion /> 页面的标记确实允许我在Web部件区域中嵌套一个小部件,用户似乎有点不需要在“设计”选项卡和“页面”选项卡之间切换,以实现添加嵌套组件,更不用说必须将每个Web部件注册为小部件;这是完全不必要的。我注意到kentico的内置布局webpart允许嵌套webpart,所以我查看了代码,终于能够找出如何在另一个webpart中实现嵌套webpart!

    确保网页部件的代码隐藏继承自 CmsAbstractLayoutWebPart

    将以下方法添加到代码隐藏中:

    protected override void PrepareLayout()
    {
        StartLayout();
    
        Append("<div");
        Append(" style=\"width: ", "100%", "\"");
    
        if (IsDesign)
        {
            Append(" id=\"", ShortClientID, "_env\">");
    
            Append("<table class=\"LayoutTable\" cellspacing=\"0\" style=\"width: 100%;\">");
    
            if (ViewModeIsDesign())
            {
                Append("<tr><td class=\"LayoutHeader\" colspan=\"2\">");
    
                // Add header container
                AddHeaderContainer();
    
                Append("</td></tr>");
            }
    
            Append("<tr><td id=\"", ShortClientID, "_info\" style=\"width: 100%;\">");
        }
        else
        {
            Append(">");
        }
    
        // Add the tabs
        var acc = new CMSAccordion();
        acc.ID = ID + "acc";
        AddControl(acc);
    
        if (IsDesign)
        {
            Append("</td>");
    
            if (AllowDesignMode)
            {
                // Width resizer
                Append("<td class=\"HorizontalResizer\" onmousedown=\"" + GetHorizontalResizerScript("env", "Width", false, "info") + " return false;\">&nbsp;</td>");
            }
    
            Append("</tr>");
        }
    
        // Pane headers
        string[] headers = TextHelper.EnsureLineEndings("HEADER", "\n").Split('\n');
    
        // Create new pane
        var pane = new CMSAccordionPane();
        pane.ID = ID + "pane";
    
        pane.Header = new TextTransformationTemplate(string.Empty);
        acc.Panes.Add(pane);
    
        pane.WebPartZone = AddZone(ID + "-ContentArea", ID + "-ContentArea", pane.ContentContainer);
    
        acc.SelectedIndex = 1;
    
        if (IsDesign)
        {
            if (AllowDesignMode)
            {
                Append("<tr><td class=\"LayoutFooter cms-bootstrap\" colspan=\"2\"><div class=\"LayoutFooterContent\">");
    
                // Pane actions
                Append("<div class=\"LayoutLeftActions\">");
                Append("</div></div></td></tr>");
            }
    
            Append("</table>");
        }
        Append("</div>");
    
        FinishLayout();
    }