【问题标题】:Does overriding Sharepoint's Render method accomplish the same thing as overriding CreateChildControls?重写 Sharepoint 的 Render 方法是否与重写 CreateChildControls 完成相同的事情?
【发布时间】:2015-05-26 18:27:30
【问题描述】:

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

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() 中所示?

【问题讨论】:

    标签: sharepoint sharepoint-2010 rendering createchildcontrols


    【解决方案1】:

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

    有关 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 上的服务器端控件。我在帖子http://blogs.msdn.com/b/kaevans/archive/2011/04/28/user-controls-and-server-controls-in-sharepoint.aspx 中提供了用户控件和服务器控件的概述以及使用 CreateChildControls() 的示例。但是,对于 SharePoint 2013,不建议使用此方法,建议您将开发移至应用程序模型...在这种情况下,您不仅限于 SharePoint 使用 ASP.NET Forms 模型,还可以使用其他模型,例如ASP.NET MVC 甚至其他平台,如 PHP、Node.js、Java 等。有关应用模型的更多信息,请参阅http://dev.office.com

    【讨论】:

      猜你喜欢
      • 2023-02-05
      • 2017-01-04
      • 1970-01-01
      • 2010-11-16
      • 2013-08-16
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 2019-06-19
      相关资源
      最近更新 更多