【问题标题】:Dynamically created controls and the ASP.NET page lifecycle动态创建的控件和 ASP.NET 页面生命周期
【发布时间】: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


【解决方案1】:

从德克到德克 :-)

RenderDynamicControls 是什么意思?创建和设置控件?如果这是您的意图,则不是 ASP.NET 正在管理您的 ViewState,但您确实这样做了。如果您在每次加载时填充控件,您总是会覆盖现有的 ViewState!

如果您想使用 ViewState,请在页面 init 事件中创建您的控件并将它们填充到 load 事件中,但前提是请求不是回发。这是必要的,因为 ASP.NET 在初始化和加载之间重新创建 ViewState。这也是你描述的两个“渲染周期”的原因。您需要第一个控件创建周期,因为 ASP.NET 无法在没有适当的控件集的情况下恢复 ViewState,并且 ASP.NET 无法在没有它的情况下对您的响应做出正确的反应。

回到您的代码:通常您的 RenderDynamicControlsALittleDifferently 不起作用 - 因为您在页面生命周期中创建控件的时间太晚,并且您会通过向控件集合中插入新对象来损坏 ViewState。在类似的情况下,我通过将页面重定向到自身(Response.Redirect)解决了这个问题。在这种情况下,RenderDynamicControls 会根据您更改内部状态后的“稍微不同的情况”来完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多