“键入”控件状态的缺点是什么?

时间:2012-08-21 09:37:53

标签: asp.net webforms web-parts viewstate

我对Web部件和Web表单相对较新(我只使用过MVC框架)。

我打算将一些数据存储在控件状态。我可以找到的所有示例都将object[]数组置于控件状态,并将base控件状态置于0索引上。

我真的不喜欢把所有内容放在object[]中,所以我想为我的网页部分创建一个额外的类,其中包含类型属性:例如MyWebPartControlState。我将基本控件状态存储在BaseControlState类型的属性object中。

我想知道这是否会导致任何问题,或者是否有任何其他原因导致这可能不是一个好主意。我想知道因为这对我来说是合乎逻辑的,但是我找不到控制状态的任何例子,他们没有直接或在object[]中将所有内容都置于控制状态。

提前致谢。

1 个答案:

答案 0 :(得分:3)

控件状态与视图状态保持在同一个字段中,并遵循相同的序列化规则。您找到的所有示例都使用对象数组,因为它是ASP.NET中优化状态序列化程序可以理解的类型之一,并且可以优化序列化。

如果您使用自定义对象,则序列化程序不会使用优化,而是使用BinaryFormatter 序列化您的对象,这将导致膨胀控制状态。如果你想拥有一个强类型的状态视图,你应该在自定义类上实现IStateManager,这样它就可以封装自身与序列化程序理解的简单对象的转换。

如果我没记错,序列化程序可以有效地序列化以下类型:

  • 原始类型(intlong等);
  • DateTime;
  • string;
  • 支持值类型的盒装值;
  • 包含受支持类型实例的对象数组;
  • PairTriplet个对象包含受支持类型的实例。

我写了一篇简短的博客文章,说明了使用BinaryFormatter序列化的简单自定义类与实现IStateManager并分解为序列化程序可以优化的简单类型所导致的大小差异。您可以在以下网址找到它:

ASP.NET ViewState Tips and Tricks #2