将WebPart嵌套在另一个WebPart中

时间:2018-07-19 21:18:24

标签: c# asp.net nested web-parts kentico

有人知道Kentico CMS中是否存在将Web部件嵌套在另一个Web部件中的方法?我做了一些研究,但没有看到关于该主题的很多结果,因此似乎简短的答案是“否”,但是也许有解决方法?在我正在从事的项目中,要求内容作者能够在页面上放置一个汉堡菜单,然后通过拖放在该汉堡菜单中添加其他内容。在Kentico中如何实现?

谢谢。

3 个答案:

答案 0 :(得分:1)

通常,Web部件由用户控件而不是嵌套的Web部件组成。以CMSRepeater为例。它设置由Kentico创建的用户控件的属性。

对于您正在解释的内容,您似乎想要其中包含小部件区域的自定义Web部件。这些小部件区域允许您将内容拖放到位(我不知道什么内容,因为您不能在Kentico中拖放内容,只能拖放区域/小部件)。

对于导航,您可能要考虑根据内容树创建它,但是在您的情况下,可能不适合使用汉堡菜单。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

转回此帖。尽管在页面上添加<cms:CMSEditableRegion />标记确实确实允许我在Webpart区域中嵌套Widget,但是对于用户来说,为了实现添加标签的目的,不得不在设计选项卡和页面选项卡之间切换似乎有点不必要。嵌套的组件,更不用说将每个Web部件都注册为小部件了;完全没有必要。我注意到Kentico的内置Layout webpart允许嵌套的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();
}