Почему 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()
Видимо, как и на складе, рендеринг происходит много раз, а страница загружается только один раз. Это моя теория, и я придерживаюсь ее (пока, во всяком случае).