All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
VS,2008,中文版,(90天评估)_[Asp.Net教程]
EditPlus+NAnt构建轻巧的.NET开发环境_[Asp.Net教程]
ASP.NET2.0中Gridview的使用技巧_[Asp.Net教程]
ASP.NET+Atlas创建客户端Web应用程序_[Asp.Net教程]
在ASP.NET2.0中的WEB.CONFIG文件中调用外部文件_[Asp.Net教程]
让您网页的按钮也能使用热键_JavaScript技术_编程技术
PHP中 ADODB 类库介绍(一)_[PHP教程]
C#文件处理技术:文件的读取使用方法
查询数据库中重复记录的方法_[SQL Server教程]
SQL Server 安装参考意见_[SQL Server教程]
Reading number is top 10 pictures
可爱的小动物
On the verge of extinction of the beach1
The money of more than 100 countries and regions8
Terrorist smile the largest human history an explosion1
Ashlynn Brooke a group sexy photo4
西游日记4
两张抽象画
代沟,真好
Sell the barbecue as says father du breul3
一万二一支的万珂,用得真心肉疼。
Download software ranking
Tram sex maniac 2 (H) rar bag2
Boxer's Top ten classic battle5
超级战舰
网页特效实例大全
WebService在.NET中的实战应用教学视频 → 第3集
圣殿祭司的ASP.NET.2.0.开发详解-使用C#
Ashlynn Video4
The hero
ASP.NET.2.0.XML.高级编程(第3版)
jdk1.6 for windows
delv published in(发表于) 2014/1/6 8:48:54 Edit(编辑)
ASP.NET,ViewState,初探_[Asp.Net教程]

ASP.NET,ViewState,初探_[Asp.Net教程]

ASP.NET ViewState 初探_[Asp.Net教程]























与刚接触 ASP.NET 页面的开发人员交谈时,他们通常向我提出的第一个问题就是:“那个 ViewState 到底是什么?”他们的语气中流露出的那种感觉,就象我来到一家异国情调的餐馆,侍者端上一道我从未见过的菜肴时的那种感觉 - 既疑惑不解,又充满好奇。但肯定有人认为它不错,否则就不会提供了。所以,我会先尝一尝,或许会喜欢上它,尽管它看上去的确很古怪!

对于 ViewState 也是如此,但是如果适应了它的风格,您会发现在许多情况下,您将乐于在自己的 ASP.NET 应用程序中使用 ViewState,因为它可以帮助您使用更少的代码完成更多的工作。但是,有时也会对 ViewState 完全弃之不用。下面我们就这两种情况分别进行阐述,不过,让我们先回答什么是 ViewState 这个问题。

答案:ViewState 用于维护页面的 UI 状态
Web 是没有状态的,ASP.NET 页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。作为 Web 开发人员,您可以使用众所周知的技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。下面我们以图 1 中的注册窗体为例进行论述。


图 1:恢复回传的窗体值

从上图中可以看出,我为便餐选择了一个无效的值。此窗体与 Web 上的多数窗体一样友好,它在出现错误的字段旁边显示一条有用的错误消息和一个星号。而且,窗体中还显示了我在其他文本框和下拉列表中输入的所有有效值。这在某种程度上是可能的,因为 HTML 窗体元素会在 HTTP 标头中将其当前值从浏览器发送到服务器。您可以使用 ASP.NET 跟踪来查看回传的窗体值,如图 2 所示。


图 2:HTTP 窗体中回传的值(通过 ASP.NET 跟踪显示)

在 ASP.NET 之前,通过多次回传将值恢复到窗体字段中完全是页面开发人员的责任,他们将不得不从 HTTP 窗体中逐个拾取回传值,然后再将其推回字段中。幸运的是,现在 ASP.NET 可以自动完成这项任务,从而为开发人员免除了一项令人厌烦的工作,同时也无需再为窗体编写大量的代码。但这并不是 ViewState。

ViewState(英文)是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传。例如,由 Label 控件显示的文本默认情况下就保存在 ViewState 中。作为开发人员,您可以绑定数据,或在首次加载该页面时仅对 Label 编程设置一次,在后续的回传中,该标签文本将自动从 ViewState 中重新填充。因此,除了可以减少繁琐的工作和代码外,ViewState 通常还可以减少数据库的往返次数。

ViewState 的工作原理
ViewState 确实没有什么神秘之处,它是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 )。由于隐藏窗体字段是发送到客户端的页面的一部分,所以 ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。在上面的图 2 中可以看到 ViewState 窗体字段及其回传的值。

回传后,ASP.NET 页面框架将解析 ViewState 字符串,并为该页面和各个控件填充 ViewState 属性。然后,控件再使用 ViewState 数据将自己重新恢复为以前的状态。

关于 ViewState 还有三个值得注意的小问题。

如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 ()。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。
在页面不回传的情况下,可以通过省略服务器端的 标记来去除页面中的 ViewState。
充分利用 ViewState
ViewState 为跨回传跟踪控件的状态提供了一条神奇的途径,因为它不使用服务器资源、不会超时,并且适用于任何浏览器。如果您要编写控件,那么肯定需要了解如何在控件中维护状态(英文)。

开发人员在编写页面时同样可以按照几乎相同的方式来利用 ViewState,只是有时页面会包含不由控件存储的 UI 状态值。您可以跟踪 ViewState 中的值,使用的编程语法与会话和高速缓存的语法类似:

[Visual Basic]
' 保存在 ViewState 中
ViewState("SortOrder") = "DESC"

' 从 ViewState 中读取
Dim SortOrder As String = CStr(ViewState("SortOrder"))

[C#]
// 保存在 ViewState 中
ViewState["SortOrder"] = "DESC";

// 从 ViewState 中读取
string sortOrder = (string)ViewState["SortOrder"];


请看下面的示例:要在 Web 页上显示一个项目列表,而每个用户需要不同的列表排序。项目列表是静态的,因此可以将这些页面绑定到相同的缓存数据集,而排序顺序只是用户特定的 UI 状态的一小部分。ViewState 非常适合于存储这种类型的值。代码如下:

[Visual Basic]
<%@ Import Namespace="System.Data" %>


用于页面 UI 状态值的 ViewState/title> <BR> </HEAD> <BR> <body> <BR> <form runat="server"> <BR> <H3> <BR> 在 ViewState 中存储非控件状态 <BR> </H3> <BR> <P> <BR> 此示例将一列静态数据的当前排序顺序存储在 ViewState 中。 <br/><BR> 单击列标题中的链接,可按该字段排序数据。 <br/><BR> 再次单击该链接,将按相反顺序排序。 <BR> <br/> <br/> <br/><BR> <asp:datagrid id="DataGrid1" runat="server" <BR> OnSortCommand="SortGrid" BorderStyle="None" BorderWidth="1px" <BR> BorderColor="#CCCCCC" BackColor="White" CellPadding="5" AllowSorting="True"> <BR> <HeaderStyle Font-Bold="True" ForeColor="White" <BR> BackColor="#006699"> <BR> </HeaderStyle> <BR> </asp:datagrid> <BR> </P> <BR> </form> <BR> </body> <BR> </HTML> <BR> <script runat="server"> <BR> <BR> ' 在 ViewState 中跟踪 SortField 属性 <BR> Property SortField() As String <BR> <BR> Get <BR> Dim o As Object = ViewState("SortField") <BR> If o Is Nothing Then <BR> Return String.Empty <BR> End If <BR> Return CStr(o) <BR> End Get <BR> <BR> Set(Value As String) <BR> If Value = SortField Then <BR> ' 与当前排序文件相同,切换排序方向 <BR> SortAscending = Not SortAscending <BR> End If <BR> ViewState("SortField") = Value <BR> End Set <BR> <BR> End Property <BR> <BR> ' 在 ViewState 中跟踪 SortAscending 属性 <BR> Property SortAscending() As Boolean <BR> <BR> Get <BR> Dim o As Object = ViewState("SortAscending") <BR> If o Is Nothing Then <BR> Return True <BR> End If <BR> Return CBool(o) <BR> End Get <BR> <BR> Set(Value As Boolean) <BR> ViewState("SortAscending") = Value <BR> End Set <BR> <BR> End Property <BR> <BR> Private Sub Page_Load(sender As Object, e As EventArgs) Handles MyBase.Load <BR> <BR> If Not Page.IsPostBack Then <BR> BindGrid() <BR> End If <BR> <BR> End Sub <BR> <BR> Sub BindGrid() <BR> <BR> ' 获取数据 <BR> Dim ds As New DataSet() <BR> ds.ReadXml(Server.MapPath("TestData.xml")) <BR> <BR> Dim dv As New DataView(ds.Tables(0)) <BR> <BR> ' 应用排序过滤器和方向 <BR> dv.Sort = SortField <BR> If Not SortAscending Then <BR> dv.Sort += " DESC" <BR> End If <BR> <BR> ' 绑定网格 <BR> DataGrid1.DataSource = dv <BR> DataGrid1.DataBind() <BR> <BR> End Sub <BR> <BR> Private Sub SortGrid(sender As Object, e As DataGridSortCommandEventArgs) <BR> DataGrid1.CurrentPageIndex = 0 <BR> SortField = e.SortExpression <BR> BindGrid() <BR> End Sub <BR> <BR> </script> <BR> <BR> [C#] <BR> <%@ Page Language="C#" %> <BR> <%@ Import Namespace="System.Data" %> <BR> <HTML> <BR> <HEAD> <BR> <title>用于页面 UI 状态值的 ViewState




在 ViewState 中存储非控件状态



此示例将一列静态数据的当前排序顺序存储在 ViewState 中。

单击列标题中的链接,可按该字段排序数据。

再次单击该链接,将按相反顺序排序。




BorderStyle="None" BorderWidth="1px" BorderColor="#CCCCCC"
BackColor="White" CellPadding="5" AllowSorting="True">









下面是上述两个代码段中引用的 testdata.xml 的代码:




0736
New Moon Books
Boston
MA
USA


0877
Binnet & Hardley
Washington
DC
USA


1389
Algodata Infosystems
Berkeley
CA
USA


1622
Five Lakes Publishing
Chicago
IL
USA


1756
Ramona Publishers
Dallas
TX
USA


9901
GGG&G
Muenchen
Germany


9952
Scootney Books
New York
NY
USA


9999
Lucerne Publishing
Paris
France






来源:ASPCOOL












































添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.