由於非常特殊和嚴格的最終用戶要求,我只能在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是完全一樣的,所以這個解決方案是一個破產。歡迎任何關於如何完成我所追求的理念。
如何將控件添加到樹中?在將它添加到樹之前,你是否初始化了你的控件?我們需要更多關於'BuildControls'做什麼的細節。 – Romhein 2010-11-02 14:44:30