2010-10-22 10 views
0

由於非常特殊和嚴格的最終用戶要求,我只能在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); 
} 

爲了實現圍繞其動態字段是必須的,禁用或可選的一些BIZ邏輯,我需要得到公佈數據前,我的動態控制(即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中丟失,即使控制型和控件ID是完全一樣的,所以這個解決方案是一個破產。歡迎任何關於如何完成我所追求的理念。

+0

如何將控件添加到樹中?在將它添加到樹之前,你是否初始化了你的控件?我們需要更多關於'BuildControls'做什麼的細節。 – Romhein 2010-11-02 14:44:30

回答

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 
      } 
     } 
} 
} 
相關問題