根据我所读的内容(我是SP的新手),ISTM认为CreateChildControls()是将控件动态添加到WebPart的首选方法,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方法使您能够将其他控件添加到控件树中,例如在添加文本框和按钮的示例中。这会将控件的呈现和回发处理推迟到控件树中的控件。CreateChildControls可以在控件生命周期中的任何位置调用。
Render方法发生在控件生命周期的特定部分,只负责呈现HTML。
请注意,可以创建同时使用CreateChildControls()和Render()的控件。
您的问题提到SharePoint,这听起来像是在询问安装在SharePoint上的服务器端控件。我在文章中提供了用户控件和服务器控件的概述,并举例说明了使用CreateChildControls()http://blogs.msdn.com/b/kaevans/archive/2011/04/28/user-controls-and-server-controls-in-sharepoint.aspx.但是,SharePoint 2013不建议使用此方法,建议您将开发转移到应用程序模型。。。在这种情况下,您不限于SharePoint使用ASP.NET Forms模型,您可以使用其他模型,如ASP.NET MVC,甚至其他平台,如PHP、Node.js、Java等。请参阅http://dev.office.com有关应用程序型号的更多信息。