Asp.net 在回发期间更改动态加载的控件
我正在尝试设计一个页面,根据用户的偏好处理Asp.net 在回发期间更改动态加载的控件,asp.net,c#-4.0,dynamic-controls,Asp.net,C# 4.0,Dynamic Controls,我正在尝试设计一个页面,根据用户的偏好处理员工和站点CRUD任务。我对UserControl进行了子分类,以创建一个edintentitycontrol,并开发了两个自定义控件,它们派生自这个基类,每个控件处理Employee或Station对象的CRUD活动 当用户切换dropdownlist中的值(这会触发回发)时,我希望将正确的控件动态加载到页面中。这适用于每个控件的第一次加载,但当我尝试重新加载第一个控件(在加载第二个控件之后)时,会出现以下错误: 未能加载viewstate。views
员工
和站点
CRUD任务。我对UserControl
进行了子分类,以创建一个edintentitycontrol
,并开发了两个自定义控件,它们派生自这个基类,每个控件处理Employee
或Station
对象的CRUD活动
当用户切换dropdownlist中的值(这会触发回发)时,我希望将正确的控件动态加载到页面中。这适用于每个控件的第一次加载,但当我尝试重新加载第一个控件(在加载第二个控件之后)时,会出现以下错误:
未能加载viewstate。viewstate所在的控件树
正在加载的控件必须与用于保存的控件树匹配
上一个请求期间的viewstate。例如,在添加
控件,回发期间添加的控件必须匹配
初始过程中添加的控件的类型和位置
请求
在第二个控件的初始加载中,我还看到一些奇怪的行为,其中数据绑定没有绑定到正确的控件(例如,设置控件上按钮的文本而不是文本框)
有没有办法处理这种情况?或者,有没有办法清除
ViewState
并完全重新请求页面以避开此错误?看来,如果我能清除回发之间的这种ViewState
混乱/混乱,其他一切都按设计进行了。上述评论中给出了很好的建议,但Joel Coehoorn的回答最终为我指出了正确的解决方案
我将控件加载到OnInit,然后在
SelectionChanged
事件中,吹走OnInit更改并根据需要重新创建正确的控件。感谢您提供有关使未使用的控件不可见的其他建议。我会记住这一点,以备将来参考。如果您不需要ViewState,您是否尝试过在控件或基本控件上将EnableViewState
设置为false?但是,我确实需要在某些回发中使用ViewState
。这些是输入表单,因此如果用户在其中一个表单上单击submit,我需要该实例中的ViewState
将值持久化到数据库中。我只想在请求第二个输入控件的实例中清除ViewState
。首先,如果用户控件的数量是可预测的,最好只切换其可见性。根本不会呈现不可见的控件,因此性能不是参数。除此之外,您应该向我们展示在哪里(页面生命周期中)以及如何加载这些控件。请注意,您可以在页面加载后动态添加控件,但不能在加载后重新创建控件(例如,在事件处理程序中)。你给他们分配了静态ID了吗?它是如何产生的?@TimSchmelter:很好的建议。