ASP.NET服务器控件 - 可以在控件之间共享Viewstate

时间:2010-10-29 17:20:41

标签: asp.net viewstate custom-server-controls

如果我有一个主'复合自定义服务器控件',有几个子自定义控件,是否可以让主控件与子控件共享其viewstate,子控件也是自定义复合服务器控件,(所有控件是复合自定义服务器控件)?

要进一步扩展,请说我有一个 Person 控件,地址控件,手机控件和 Notes 控制。 地址电话 Notes 可以作为独立控件存在,也可以作为 Person 控件的一部分存在。由于每个控件都负责自己的视图状态,并在其中存储所需的数据,因此它可以渲染/回发等,最终在视图状态中存在大量重复,因为Person控件存储所有数据,然后每个子控件再次存储自己的数据。此外,为了进一步复杂化, Person Control动态添加子控件,因此可以添加第二个地址/电话号码/注释等,这可能会导致更大的视图状态(最多1MB)

如果所有地址/电话/等等控件都是 Person 控件的子控件,我是否可以以某种方式共享公共视图状态数据,所以我在viewstate中没有2/3/4副本的东西,当它们不是组件时,只是按照正常行事?

我确实有一个解决方案的想法,但它相当讨厌的imo,我可以修改 Person 控件,公开其viewstate或数据,然后在子控件中,将检查控制层次结构,如果子控件是 Person 的一部分,则不要使用它自己的视图状态,使用暴露的视图状态。这将要求我重新编写现有代码,如果可能的话,我宁愿避免使用。

1 个答案:

答案 0 :(得分:1)

我要问的第一个问题是,“你真的需要在ViewState上保留多少这些数据?”例如,典型页面请求中是否有足够的信息能够重建某些控件中的所有信息?

我发现ASP.NET通常使用ViewState远远超过我真正需要它,如果你得到一个1MB的视图状态,我怀疑你可能也是如此。我强烈建议您阅读this article以更全面地了解ViewState的工作原理,导致值保存到ViewState的原因,以及如何避免在不需要的地方使用它。例如,您可以通过在Page_Init而不是Page_Load中完成更多工作来解决大部分问题。