为什么会一遍又一遍地调用 OnPreRender?
Why is OnPreRender being called over and over again?
在我的 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 class:
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() 中,或者...???
解决方案是将 OnPreRender() 中的代码移动到 Page_Load()
显然,就像在堆场一样,渲染发生了很多次,而页面只加载了一次。这是我的理论,我坚持(无论如何,现在)。
在我的 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 class:
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() 中,或者...???
解决方案是将 OnPreRender() 中的代码移动到 Page_Load()
显然,就像在堆场一样,渲染发生了很多次,而页面只加载了一次。这是我的理论,我坚持(无论如何,现在)。