【问题标题】:Change Dynamically Loaded Control During PostBack在回发期间更改动态加载的控件
【发布时间】:2012-04-16 13:50:31
【问题描述】:

我正在尝试设计一个页面来处理 EmployeeStation CRUD 任务,具体取决于用户的偏好。我对UserControl 进行了子类化以创建EditEntityControl,并开发了两个从该基类派生的自定义控件,每个控件都处理EmployeeStation 对象的CRUD 活动。

当用户在触发回发的下拉列表中切换值时,我想将正确的控件动态加载到页面中。这适用于每个控件的第一次加载,但是当我尝试重新加载第一个控件(加载第二个之后)时,我收到以下错误:

加载视图状态失败。视图状态所在的控制树 正在加载的必须与用于保存的控制树匹配 上一个请求期间的视图状态。例如,当添加 动态控制,回发期间添加的控件必须匹配 在初始阶段添加的控件的类型和位置 请求。

我还在第二个控件的初始加载中看到一些奇怪的行为,其中数据绑定没有绑定到正确的控件(例如,设置按钮的文本而不是控件上的文本框)。

有没有办法处理这种情况?或者,有没有办法清除 ViewState 并完全重新请求页面来解决这个错误?看来,如果我能清除 PostBacks 之间的 ViewState 混乱/混乱,其他一切都会按设计工作。

【问题讨论】:

  • 如果您不需要 ViewState,您是否尝试在控件或基本控件上将 EnableViewState 设置为 false?
  • 我有,但是,我确实需要一些 PostBacks 上的 ViewState。这些是输入表单,因此如果用户在其中一个表单上单击提交,我需要该实例中的ViewState 将值保存到数据库中。我只想在请求第二个输入控件的情况下清除ViewState
  • 首先,如果数字是可预测的,最好只切换 UserControls 的可见性。根本不呈现不可见的控件,因此性能不是一个参数。除此之外,您应该向我们展示(在页面的生命周期中)在哪里以及如何加载这些控件。请注意,您可以在 page_load 之后动态添加控件,但之后不能重新创建控件(例如在事件控制器中)。您是否为他们分配了静态 ID?它是如何创建的?
  • @TimSchmelter:很好的建议。

标签: asp.net c#-4.0 dynamic-controls


【解决方案1】:

上面的 cmets 中有很好的建议,但最终让我找到正确解决方案的是 Joel Coehoorn 在this question 上的回答。

我加载控件 OnInit,然后在 SelectionChanged 事件中清除 OnInit 更改并根据需要重新创建正确的控件。感谢有关使未使用的控件不可见的其他建议。我会记住这一点以供将来参考。

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多