ViewState 和 CrystalReportViewer 对象模型的持久性

什么是 ViewState?

ViewState 是 ASP.NET 中保持视图(也就是 Web 窗体)状态的基于浏览器的方法。其主要功能是支持 Web 控件的持久性。

Web 控件(也称为 Web 服务器控件)是以 Windows 控件(在 Visual Basic 中有所介绍)为模型创建的。Windows 控件是窗体上封装显示功能部分(例如文本字段、按钮或数据表)的对象。

Web 控件类似于 Windows 控件。与 Windows 控件一样,它们在两个级别工作:Web 页中和支持 Web 页的代码隐藏类中。类似于 Windows 窗体中的传统控件,Web 控件将不连续的显示功能部分封装到 GUI 对象中:Button、TextField、DropDownList、DataGrid 等。在代码隐藏类中,这些相同的控件以提供属性和方法的类的形式并置。

Web 页不同于 Windows 窗体,原因在于 Web 页是无状态的环境。因此,需要某种类型的持久性机制在页重新加载过程中保持 Web 页的状态。

ViewState 可以保持 Web 页上控件的状态,很大程度上类似于 Session 保持服务器上实例化对象的状态。

Note注意

ViewState 可以自动保持所有 Web 控件的状态。这是通过让 ViewState 根据控件的 EnableViewState 属性(默认为 True)存储每个控件实现的。

ViewState 存储页上 Web 控件中数据的状态,所以当页在浏览器和 Web 服务器之间来回传输时,整个 ViewState 对象必须包括在页中。这是通过将整个 ViewState 对象加密为字符串,然后将该字符串放置在页上隐藏窗体标记的值中实现的。例如,对于仅有一个按钮控件的 ASP.NET Web 页面,其 ViewState 的 HTML 代码如下:

<input type="hidden" name="__VIEWSTATE"
value="dDwtNTMwNzcxMzI0Ozs+I7GfLyg3p44eTLFCiVEiRKUBzFw=" />

ViewState 只存储可转换为字符串格式的信息。

保持 CrystalReportViewer 控件的报表显示

CrystalReportViewer 控件的作用是将 Crystal 报表显示出来。它将报表以 html 格式呈现在页上,同时显示一个工具栏和树视图用来控制报表显示。工具栏包含用于执行缩放、转到下一页、打印、导出等功能的按钮。树视图展开以显示数据的嵌套分组。

ViewState 保持控件信息;因此它可以在页重新加载过程中保持 CrystalReportViewer 控件所有报表显示信息(包括工具栏和树视图事件)的状态。

例如,如果用户当时正在查看报表的第 3 页并在 CrystalReportViewer 控件的工具栏中单击了“下一页”按钮,则 ViewState 将保持两部分信息的状态:

  • 当前页码。
  • “下一页”按钮的状态(已单击)。

在页重新加载过程中,ViewState 将 CrystalReportViewer 控件恢复到第 3 页,然后恢复下一页事件单击,从而使该控件将报表转到第 4 页。

保持 CrystalReportViewer 控件的对象模型

CrystalReportViewer 控件还具有其它作用,不仅仅是进行报表显示,还可以作为受限制的对象模型(包含在 CrystalReportViewer 控件类中)。此受限制的对象模型可用于与报表通过编程方式实现交互。

ViewState 保持两种角色的状态:

  • 报表显示。
  • CrystalReportViewer 对象模型。

但是,通常不鼓励使用 CrystalReportViewer 对象模型,而建议使用用途更广泛的 ReportDocument 对象模型。此替代对象模型不包含在控件中,但它是 SDK 中类库的一部分。

Note注意

有关更多信息,请参见“为您的项目选择正确的对象模型”

共享持久性机制

如果使用 CrystalReportViewer 控件执行两种角色(报表显示和对象模型),ViewState 将同时保持这两种角色的状态,您不需要任何其它持久性机制。

Note注意

将 CrystalReportViewer 控件绑定到文件目录路径即属于这种情况。请参见“用代码绑定到文件目录路径”

但是,如果选择将 CrystalReportViewer 控件只用于报表显示,并随后将该控件绑定到外部对象模型(例如 ReportDocument),则需要单独的持久性机制保持该外部对象模型。通常,第二种持久性机制是使用 Session(或者偶尔使用 Cache)。

请参见