为什么一遍又一遍地调用OnPreRender?

时间:2015-05-05 16:44:29

标签: asp.net sharepoint-2010 web-parts pageload webpartpage

在我的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()只运行一次?或者此代码应该在Page_Load()而不是OnPreRender(),或者...... ???

1 个答案:

答案 0 :(得分:0)

解决方案是将OnPreRender()中的代码移动到Page_Load()

显然,就像在堆场一样,渲染多次发生,而页面只加载一次。这是我的理论,而且我还在坚持不懈。对它(现在,无论如何)。