覆盖 Sharepoint 的 Render 方法是否完成与覆盖 CreateChildControls 相同的事情?

Does overriding Sharepoint's Render method accomplish the same thing as overriding CreateChildControls?

根据我读过的内容(我是 SP 的新手),ISTM 认为 CreateChildControls() 是向 WebPart 动态添加控件的首选方法,a la:

protected override void CreateChildControls()
{
    base.CreateChildControls();

    lbl = new Label();
    lbl.Text = "Look at this";
    this.Controls.Add(lbl);

    tb = new TextBox();
    this.Controls.Add(tb);

    btnSave = new Button();
    btnSave.Width = new Unit(50, UnitType.Pixel);
    btnSave.Text = "Click me if you dare";
    btnSave.Click += new EventHandler(btnSave_Click);
    this.Controls.Add(btnSave);
}

但是,我在此处的遗留代码中看到未使用 CreateChildControls();相反,我看到这样的代码,覆盖 Render():

protected override void Render(HtmlTextWriter output)
{
    try
    {
        List<Announcement> announcements = getAnnouncements(AnnouncementsList);
        if (announcements.Count > 0)
            output.Write(makeHTML(announcements));
    }
    catch (Exception e)
    {
        output.Write("Exception: " + e.Message);
    }
}

...然后调用自定义方法让 HTML 呈现:

protected string makeHTML(List<Announcement> announcementList)
{
    string r = "<div class='platypus-announcements-panel'>";
    r += "<h2 class='platypus-white-panel-title'>" + Header + "</h2>";
    r += "<dl>";
    foreach (Announcement curr in announcementList)
    {
        r += "<dt>" + curr.date.ToString("MMM") + "<strong>" + curr.date.Day + "</strong>" + curr.date.ToString("yyyy") + "</dt>";
        r += "<dd>" + curr.content + "</dd>";
    }
    r += "</dl>";
    r += "</div>";
    return r;
}

以这种方式直接添加 HTML 是否比动态创建控件更可取,如上面在 CreateChildControls() 中所示?

没有一种首选方式,它们用于不同的目的。

有关 ASP.NET 控件生命周期的概述,请参阅 https://msdn.microsoft.com/en-us/library/aa719775(v=vs.71).aspx。它说它适用于 .NET 1.1,但仍然与您的问题相关。

CreateChildControls 方法使您能够向控件树添加其他控件,例如在您的示例中添加文本框和按钮。这将控件的呈现和 post 后台处理推迟到控件树中的控件。 CreateChildControls 可以在控件生命周期的任何地方调用。

Render 方法发生在控件生命周期的特定部分,只负责渲染 HTML。

请注意,可以创建同时使用 CreateChildControls() 和 Render() 的控件。

您的问题提到了 SharePoint,这听起来像是您在询问安装在 SharePoint 上的服务器端控件。我通过在 post http://blogs.msdn.com/b/kaevans/archive/2011/04/28/user-controls-and-server-controls-in-sharepoint.aspx. However, this approach is not recommended for SharePoint 2013, it is recommended that you move development to the app model... in which case you are not limited to SharePoint's use of the ASP.NET Forms model, you can use other models such as ASP.NET MVC or even other platforms such as PHP, Node.js, Java, etc. See http://dev.office.com 中使用 CreateChildControls() 的示例提供了用户控件和服务器控件的概述,以获取有关应用程序模型的更多信息。