我正在使用 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
}
}
不幸的是,当您清除一个控件并重新添加它时,即使控件类型和 ControlID 完全相同,ViewState 也会丢失,因此该解决方案是失败的。欢迎任何关于如何完成我所追求的合理想法!