【发布时间】:2010-05-10 22:00:58
【问题描述】:
我正在开发一个 ASP.NET 项目,其中绝大多数表单都是在运行时动态生成的(表单定义存储在数据库中以进行定制)。因此,我必须在每次 OnLoad 触发时动态地创建控件并将其添加到页面中,而不管 IsPostBack 是什么。这一直工作得很好,.NET 负责管理这些控件的 ViewState。
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
RenderDynamicControls()
}
private void RenderDynamicControls()
{
//1. call service layer to retrieve form definition
//2. create and add controls to page container
}
我有一个新要求,如果用户单击给定按钮(此按钮是在设计时创建的),则应以稍微不同的方式重新呈现页面。因此,除了在 OnLoad 中执行的代码(即 RenderDynamicControls())之外,我还有以下代码:
protected void MyButton_Click(object sender, EventArgs e)
{
RenderDynamicControlsALittleDifferently()
}
private void RenderDynamicControlsALittleDifferently()
{
//1. clear all controls from the page container added in RenderDynamicControls()
//2. call service layer to retrieve form definition
//3. create and add controls to page container
}
我的问题是,这真的是实现我所追求的唯一方法吗?仅仅为了响应按钮单击而有效地呈现表单两次似乎超出了hacky。我从我的研究中得知,这就是页面生命周期在 ASP.NET 中的工作方式:也就是说,在调用子事件之前,必须在每个 Postback 上触发 OnLoad。不过,在不得不喝酷爱饮料之前咨询 SO 社区是值得的。
在相关说明中,一旦我完成了此功能,我计划在页面上抛出一个 UpdatePanel 以通过 Ajax 执行页面更新。任何使过渡更容易的代码/建议将不胜感激。
【问题讨论】:
-
欢迎使用 ASP.NET。准备将所有逻辑抛出窗口
标签: c# asp.net events updatepanel page-lifecycle