0

私のSharepoint 2010 WebPartには、次のコードがあります:

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    if (this.dpsvisWebPart != null && this.dpsvisWebPart.CustomTitleProp != null)
    {
        lbl_Title.Text = String.Format("<h1>{0}</h1>", this.dpsvisWebPart.CustomTitleProp.ToString());

        if (this.dpsvisWebPart.CheckboxGenSection1)
        {
            GenerateSection1();
        }
        if (this.dpsvisWebPart.CheckboxGenSection2)
        {
            GenerateSection2();
        }
        if (this.dpsvisWebPart.CheckboxGenSection3)
        {
            GenerateSection3();
        }
        if (this.dpsvisWebPart.CheckboxGenSection4)
        {
            GenerateSection4();
        }
        if (this.dpsvisWebPart.CheckboxGenSection5)
        {
            GenerateSection5();
        }
        if (this.dpsvisWebPart.CheckboxGenSection6)
        {
            GenerateSection6();
        }
        if (this.dpsvisWebPart.CheckboxGenSection7)
        {
            GenerateSection7();
        }

        if (AnyCheckboxSelected())
        {
            // Create Save button
            this.Controls.Add(new LiteralControl("<br />"));
            Button btnSave = new Button();
            btnSave.Text = "Save";
            btnSave.Click += new EventHandler(btnSave_Click);
            this.Controls.Add(btnSave);

            AddVerticalSpace();
        }
    }
}

WebPart をテストすると (ボタンをクリックして、おそらく btnSave_Click ハンドラーを実行すると、何も保存されていないことがわかりました。

コードをステップ実行すると、OnPreRender に到達していることがわかります - 実際、何度も何度も。

そこで、これを WebPart クラスに追加しました。

private bool PreRenderAlreadyRun = false;

...そして、OnPreRender() の先頭を次のように変更しました。

protected override void OnPreRender(EventArgs e)
{
    if (PreRenderAlreadyRun) return;
    PreRenderAlreadyRun = true;
    base.OnPreRender(e);
    . . .

...しかし、OnPreRender が入力されると、PreRenderAlreadyRun は常に false になり、これが何度も発生します。おそらくページが無限ループにあるため、他のブレークポイント (ボタンのクリックなど) に到達していません。

OnPreRender() を 1 回だけ実行するにはどうすればよいですか? または、このコードを OnPreRender() ではなく Page_Load() に入れる必要がありますか、それとも...???

4

1 に答える 1

0

解決策は、OnPreRender() にあったコードを Page_Load() に移動することでした。

どうやら、ストック ヤードと同じように、レンダリングは何度も行われますが、ページは 1 回だけ読み込まれます。それが私の理論であり、私はそれに固執しています(とにかく、今のところ)。

于 2015-05-05T21:45:49.963 に答える