2009-10-01 81 views
4

虽然看起来“创建服务器控件”的“正确”方式是构造CreateChildControls调用中的所有子控件。但是由于很难知道什么时候会被调用(这是整个点作为性能优化),所以我在OnInit或OnLoad中看到我们的大部分开发人员都在构建它。这工作99%的案件。我们不得不使用CreateChildControls吗?当“必须”我使用asp.net CreateChildControls()?

回答

4

您应该始终在CreateChildControls中构建您的子控件。这是生命周期中初始化并将其添加到控制树的适当时间。其中一个原因是,许多时候调用EnsureChildContols方法,然后在必要时调用CreateChildControls。最佳实践,就这样做。

2

Control Execution Lifecycle

CreateChildControls方法被称为每当ASP.NET页面框架需要创建控件树,此方法调用不限于特定阶段在控制的生命周期。例如,可以在加载页面时,数据绑定期间或在渲染期间调用CreateChildControls

0

性能方面,等待创建子控件将为您的服务器节省一些不必要的CPU时间。例如,如果引发异常或在调用CreateChildControls()之前中断了线程,则保存创建这些控件所需的时钟周期。

有什么理由说在OnInit中创建控件比在CreateChildControls()中更有效?

+0

不,我说的是使用CreateChildControls更高效,因为可能避免不必要的工作。然而,有时候需要等一等,比如说base.OnLoad,因为它会得到一些数据,这些数据将决定你应该如何创建这些孩子。在这种情况下,由于您不知道何时会调用EnsureChildControls,因此无法将子级创建延迟至OnLoad之后。它工作,如果我只是在OnLoad中创建一切... – Xerion 2009-10-01 23:46:37

+0

@ Xerion:足够公平。我不知道为什么你的CreateChildControls无法获取数据,但我确定有一些设计理由。 – JustLoren 2009-10-02 12:53:29

+0

如果这是最好的论据,那是多么愚蠢的“优化”。谁在乎,如果请求需要150ms而不是149.5ms,如果它导致400/500 *这应该是罕见的*? – 2012-08-06 02:19:22

0

您将在Init或Load中创建控件,直到您编写需要重新创建控件的控件为止。

我发现最好是在CreateChildControls中创建控件,然后使用EnsureChildControls来控制确保在需要时创建它们。这使您可以通过将ChildControlsCreated设置为false来拆除控件,并在需要时再次重新创建它们。