【发布时间】:2012-04-16 13:50:31
【问题描述】:
我正在尝试设计一个页面来处理 Employee 和 Station CRUD 任务,具体取决于用户的偏好。我对UserControl 进行了子类化以创建EditEntityControl,并开发了两个从该基类派生的自定义控件,每个控件都处理Employee 或Station 对象的CRUD 活动。
当用户在触发回发的下拉列表中切换值时,我想将正确的控件动态加载到页面中。这适用于每个控件的第一次加载,但是当我尝试重新加载第一个控件(加载第二个之后)时,我收到以下错误:
加载视图状态失败。视图状态所在的控制树 正在加载的必须与用于保存的控制树匹配 上一个请求期间的视图状态。例如,当添加 动态控制,回发期间添加的控件必须匹配 在初始阶段添加的控件的类型和位置 请求。
我还在第二个控件的初始加载中看到一些奇怪的行为,其中数据绑定没有绑定到正确的控件(例如,设置按钮的文本而不是控件上的文本框)。
有没有办法处理这种情况?或者,有没有办法清除 ViewState 并完全重新请求页面来解决这个错误?看来,如果我能清除 PostBacks 之间的 ViewState 混乱/混乱,其他一切都会按设计工作。
【问题讨论】:
-
如果您不需要 ViewState,您是否尝试在控件或基本控件上将
EnableViewState设置为 false? -
我有,但是,我确实需要一些 PostBacks 上的
ViewState。这些是输入表单,因此如果用户在其中一个表单上单击提交,我需要该实例中的ViewState将值保存到数据库中。我只想在请求第二个输入控件的情况下清除ViewState。 -
首先,如果数字是可预测的,最好只切换 UserControls 的可见性。根本不呈现不可见的控件,因此性能不是一个参数。除此之外,您应该向我们展示(在页面的生命周期中)在哪里以及如何加载这些控件。请注意,您可以在 page_load 之后动态添加控件,但之后不能重新创建控件(例如在事件控制器中)。您是否为他们分配了静态 ID?它是如何创建的?
-
@TimSchmelter:很好的建议。
标签: asp.net c#-4.0 dynamic-controls