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 保持服务器上实例化对象的状态。
注意 |
---|
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 中类库的一部分。
注意 |
---|
有关更多信息,请参见“为您的项目选择正确的对象模型”。 |
共享持久性机制
如果使用 CrystalReportViewer 控件执行两种角色(报表显示和对象模型),ViewState 将同时保持这两种角色的状态,您不需要任何其它持久性机制。
注意 |
---|
将 CrystalReportViewer 控件绑定到文件目录路径即属于这种情况。请参见“用代码绑定到文件目录路径”。 |
但是,如果选择将 CrystalReportViewer 控件只用于报表显示,并随后将该控件绑定到外部对象模型(例如 ReportDocument),则需要单独的持久性机制保持该外部对象模型。通常,第二种持久性机制是使用 Session(或者偶尔使用 Cache)。
请参见
-
在本节中,您将学习 Crystal Reports SDK 的基础知识。这些基础知识能帮助您规划项目的结构。