Почему OnPreRender вызывается снова и снова?

В моем 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);
    . . .

... но PreRenderAlreadyRun всегда ложно, когда вводится OnPreRender, что происходит снова и снова. Другие точки останова не достигаются (нажатие кнопки и т. Д.), Предположительно, потому что страница находится в бесконечном цикле.

Как я могу заставить OnPreRender() запускаться только один раз? Или этот код должен быть в Page_Load() вместо OnPreRender(), или...???

1 ответ

Решение

Решением было переместить код, находящийся в OnPreRender(), в Page_Load()

Видимо, как и на складе, рендеринг происходит много раз, а страница загружается только один раз. Это моя теория, и я придерживаюсь ее (пока, во всяком случае).

Другие вопросы по тегам