【问题标题】:Where in the page lifecycle can I safely load/remove dynamic controls?我可以在页面生命周期的哪个位置安全地加载/删除动态控件?
【发布时间】:2010-10-22 01:50:39
【问题描述】:

我正在使用 ASP.NET 中的动态字段,因为最终用户的要求非常具体且严格,需要 2 小时才能解释清楚。我只想说,我不能让这个要求消失。

无论如何,我有一个可行的解决方案;控件加载、呈现或维护其 ViewState 没有问题。这就是我的 OnLoad 的样子:

public void override OnLoad(EventArgs e){
    //don't need to check IsPostback, we have to load the controls on every POST    
 FormDefinition initialFormDefinition = ServiceLayer.GetFormDefinition(id);
 BuildControls(initialFormDefinition);
}

为了实现一些需要、禁用或可选动态字段的业务逻辑,我需要先获取动态控件的发布值(即 ViewState),然后才能将它们实际添加到页面控件层次结构中。

我想这有点像鸡/蛋的问题。在我将 ViewState 全部添加到页面之前,ASP.NET 不会自动将 ViewState 与适当的动态控件相关联。另一方面,在我的服务层应用了依赖于它们当前值的商业规则之前,我无法将这些控件添加到页面中。我试图通过编写这段伪代码来解决这个相当不愉快的问题:

public void override OnLoad(EventArgs e){
 FormDefinition initialFormDefinition = ServiceLayer.GetFormDefinition(id);
 BuildControls(initialFormDefinition);
 if (IsPostBack){
  PushControlValuesIntoForm(initialFormDefinition);
  var updatedFormDefinition = ServiceLayer.ApplyBizRules(initialFormDefinition);
  ReBuildControls(updatedFormDefinition); //remove controls and re-add them
 }
}

不幸的是,当你清除一个控件并重新添加它时,ViewState 会丢失,即使控件类型和 ControlID 完全相同,所以这个解决方案是失败的。欢迎任何关于如何完成我所追求的合理想法!

【问题讨论】:

  • 如何将控件添加到树中?您是否在将控件添加到树之前对其进行初始化?我们需要更多关于 BuildControls 做什么的详细信息。

标签: asp.net viewstate page-lifecycle dynamic-controls


【解决方案1】:

一种方法是加载控件,然后决定是否需要更新表单定义,如果是,则重新启动页面生命周期。请看下面的示例代码:

public void override OnLoad(EventArgs e){

 var updatedFormDef = Context.Items["UpdatedDef"] as FormDefinition;
 if (null != updatedFormDef)
 {
    // Updated form def, rebuild controls
    BuildControls(updatedFormDef);
 } 
 else
 {
    // load initial form def
    var initialFormDefinition = ServiceLayer.GetFormDefinition(id);
    BuildControls(initialFormDefinition);
    // check whether we need to update form def
    if (IsPostBack){
       PushControlValuesIntoForm(initialFormDefinition);
       var updatedFormDefinition = ServiceLayer.ApplyBizRules(initialFormDefinition);
       if (null != updatedFormDefinition)
       {
          // we have to update UI, transfer to self
          Context.Items["UpdatedDef"] = updatedFormDefinition;
          try
          {
              Server.Transfer(this.Request.RawUrl, true);
          }
          catch(ThreadAbortException)
          {
             // Do nothing
          }
       }
 }
}

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多