0

複合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の呼び出しに依存します。

ビューステートが大きくなる理由を誰かに説明してもらえますか?前もって感謝します。

4

2 に答える 2

0

ビューステートが設定される理由は、チェックボックスを含むデータコントロールの大部分によってIPostBackDataHandlerインターフェイスを実装するためです。インターフェースのメソッドLoadPostDataは、LoadViewStateイベントとビューステートが投稿されたデータから入力された後に自動的に呼び出されます。 ここにそれについての素晴らしい記事があります。

于 2013-01-28T07:06:14.330 に答える
0

コントロールのチェックボックスのビューステートを無効にしてみましたか。特に指定しない限り、ビューステートはこのコントロールを考慮に入れる必要があると思いますか?ビューステートを有効のままにしておきたいが、ライフサイクル内でこのコントロールを簡単に使用したい場合。

于 2013-01-23T14:08:20.490 に答える