複合Webサーバーコントロールがありますが、現時点ではアクションを実行していません。私の目的は、チェックボックスで始まる子コントロールをその中に配置することです。私はそれを次のようにしようとしています:
[DefaultProperty("Text")]
[ToolboxData("<{0}:SubmitImageControl runat=\"server\"></{0}:SubmitImageControl>")]
public class SubmitImageControl : CompositeControl
{
private CheckBox _checkBox;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
protected override void CreateChildControls()
{
_checkBox = new CheckBox();
Controls.Add(_checkBox);
base.CreateChildControls();
}
protected override void RenderContents(HtmlTextWriter output)
{
_checkBox.RenderControl(output);
}
}
ページへの登録と配置:
<%@ Register TagPrefix="uc" Namespace="PostBackHandlerApp.Controls" Assembly="PostBackHandlerApp" %>
<uc:SubmitImageControl runat="server" />
チェックボックスがページに表示され、ビューの状態を確認するまではすべて問題ないようです。その値は
/wEPDwULLTExMTg2MzM0NjJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBR1jdGwwMCRNYWluQ29udGVudCRjdGwwMCRjdGwwMD+PWeqrbtVyQSNMxvfjcmJkKAwpIuEPWJd+m5W6eJtQ
次に、コードControls.Add(_checkBox);を削除するだけです。、ビューステートサイズが大幅に減少します。
/wEPDwULLTExMTg2MzM0NjJkZLrri0oSGPS9ZiOTsRtSageoskXzCME4KCdRZxOiJyR9
子の初期化のコードを移動して、コントロールのOnInitメソッドに追加すると(私が知る限り、ビューステートトレースはまだ無効になっています)、結果は同じままです。また、このMSDNの記事では、CreateChildControlsメソッドでのみ初期化を実行することを推奨しています。
子コントロールは、OnInitや別のライフサイクルフェーズではなく、CreateChildControlsメソッドで作成する必要があります。サーバー制御アーキテクチャは、データバインディング中(該当する場合)など、Controlsコレクションが必要な場合は常にCreateChildControlsの呼び出しに依存します。
ビューステートが大きくなる理由を誰かに説明してもらえますか?前もって感謝します。