ASP.NET页面——视图状态

转载 2016年05月30日 13:54:01
作者:无风  http://www.cnblogs.com/zhaozhan/archive/2009/06/21/1507844.html
【转载自无风博客】

      从运行的ASP.NET应用程序中,首先注意的是页面的会送功能。这对于开发人员真的是一个好处,开发人员不用手动保存服务器的每次往返之间的信息。ASP.NET为服务的服务器控件(服务器控件使用runat=’”server”属性指定)提供视图状态。当ASP.NET为HTML的形式呈现页面时,它创建一个隐藏的窗体字段,成为_ViEWSTATE。这个字段是一个加密的、标记化得字符串(可以通过工具ViewStateDecoder查看,下载地址),包含ASP.NET页面上每个控件的名/值对。每个控件存储的值实际上时控件关联的值和状态信息。当页面被发送到服务器是,ASP.NET可以轻松地使用这些值并重新构建页面控件,控件的值和状态,不用开发人员编写代码。

创建一个ASP.NET页面PageViewStateDemo.aspx实现一个文本框,两个按钮实现文本框的隐藏和显示,以说明ViewState字段值是如何工作的。页面代码如下:

<formid="form1"runat="server">
<div><br/><br/><br/><br/>
</div>
<divstyle="display:inline; z-index:101; left:16px; width:70px; position:absolute;
top:25px; height:15px">Test Field</div>
<asp:TextBoxID="txtName"style="z-index:106; left:101px; position:absolute;
top:23px"runat="server"></asp:TextBox>
<asp:ButtonID="btnHide"
style="z-index:111; left:15px; position:absolute; top:59px;"runat="server"
Width="61px"Text="Hide"onclick="btnHide_Click" />
<asp:ButtonID="btnShow"
style="z-index:112; left:95px; position:absolute; top:59px;"runat="server"
Width="61px"Text="Show"onclick="btnShow_Click" /> </form>

后台代码很简单:
protected void btnHide_Click(object sender, EventArgs e)
{
this.txtName.Visible = false;
}
protected void btnShow_Click(object sender, EventArgs e)
{
this.txtName.Visible = true;
}

在浏览器查看该页面,在ASP.NET页面返回后查看其源代码:
image

利用刚才提到的ViewState查看工具ViewStateDecoder查看ViewState:
image

点击Hide按钮再看源代码:
image



可以看到ViewState的值不一样了:

image



ViewState在开发Web页面是确实可以节约时间。但是,它有性能成本。在上面的例子可以看出,对服务器控件的一个属性的最轻微的修改也会改变视图状态的大小。在页面中添加10到20个简单的服务器控件,和几个高级的服务器控件,可以看到呈现HTML的大小可以变成应用程序的一个瓶颈,尤其是对于带宽有限的用户来说。

为了提高ASP.NET应用程序的性能,必须得控制服务器控件的使用以降低呈现的HTML的大小。控制服务器控件的手段就是在不需要服务器的代码执行期间在不需要与控件交互时使用静态的HTML控件。

image

对一个正常的HTML控件使用runat=“server”属性,它就可以从服务器端的代码中访问,并且和ASP.NET服务器控件具有相同的性能损失。

禁用ViewState的方式有:

1、禁用控件的ViewState
<asp:TextBox ID="TextBox1" EnableViewState="false" runat="server"></asp:TextBox>

设置TextBox1的ASP.NET文本框在视图状态中不再保存任何信息。但不会影响页面中其他控件或页面本身的ViewState信息。



2、禁用页面的ViewState
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" %>



禁用用户控件的ViewState跟禁用页面的ViewState类型也是设置其EnableViewState="false" 。

3、禁用应用程序的ViewState
<pages enableViewState="false">

ASP.NET页面——视图状态

      从运行的ASP.NET应用程序中,首先注意的是页面的会送功能。这对于开发人员真的是一个好处,开发人员不用手动保存服务器的每次往返之间的信息。ASP.NET为服务的服务器控件(服务器控件使用runat=’”server”属性指定)提供视图状态。当ASP.NET为HTML的形式呈现页面时,它创建一个隐藏的窗体字段,成为_ViEWSTATE。这个字段是一个加密的、标记化得字符串(可以通过工具ViewStateDecoder查看,下载地址),包含ASP.NET页面上每个控件的名/值对。每个控件存储的值实际上时控件关联的值和状态信息。当页面被发送到服务器是,ASP.NET可以轻松地使用这些值并重新构建页面控件,控件的值和状态,不用开发人员编写代码。

      创建一个ASP.NET页面PageViewStateDemo.aspx实现一个文本框,两个按钮实现文本框的隐藏和显示,以说明ViewState字段值是如何工作的。页面代码如下:

    <formid="form1"runat="server">
    <
div><br/><br/><br/><br/>  
    </
div>
    <
divstyle="display:inline;z-index:101; left:16px; width:70px;position:absolute;
     top:25px; height:15px">Test Field</div>
    <
asp:TextBoxID="txtName"style="z-index:106;left:101px; position:absolute;
    top:23px"runat="server"></asp:TextBox>
    <
asp:ButtonID="btnHide"
      
style="z-index:111;left:15px; position:absolute; top:59px;"runat="server"
      
Width="61px"Text="Hide"onclick="btnHide_Click" />
    <
asp:ButtonID="btnShow"
      
style="z-index:112;left:95px; position:absolute; top:59px;"runat="server"
      
Width="61px"Text="Show"onclick="btnShow_Click" /> </form>

   后台代码很简单:

    protected void btnHide_Click(object sender, EventArgs e)
    {
        this.txtName.Visible = false;
    }
    protected void btnShow_Click(object sender, EventArgs e)
    {
        this.txtName.Visible = true;
    }
 
  在浏览器查看该页面,在ASP.NET页面返回后查看其源代码:
   
  
   利用刚才提到的ViewState查看工具ViewStateDecoder查看ViewState:
    
 
    点击Hide按钮再看源代码:
     

   

     可以看到ViewState的值不一样了:

image

 

     ViewState在开发Web页面是确实可以节约时间。但是,它有性能成本。在上面的例子可以看出,对服务器控件的一个属性的最轻微的修改也会改变视图状态的大小。在页面中添加10到20个简单的服务器控件,和几个高级的服务器控件,可以看到呈现HTML的大小可以变成应用程序的一个瓶颈,尤其是对于带宽有限的用户来说。

     为了提高ASP.NET应用程序的性能,必须得控制服务器控件的使用以降低呈现的HTML的大小。控制服务器控件的手段就是在不需要服务器的代码执行期间在不需要与控件交互时使用静态的HTML控件。

     image

     对一个正常的HTML控件使用runat=“server”属性,它就可以从服务器端的代码中访问,并且和ASP.NET服务器控件具有相同的性能损失。

     禁用ViewState的方式有:

     1、禁用控件的ViewState

       <asp:TextBox ID="TextBox1" EnableViewState="false"  runat="server"></asp:TextBox>

      设置TextBox1的ASP.NET文本框在视图状态中不再保存任何信息。但不会影响页面中其他控件或页面本身的ViewState信息。

 

     2、禁用页面的ViewState

<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" %>

 

      禁用用户控件的ViewState跟禁用页面的ViewState类型也是设置其EnableViewState="false"

     3、禁用应用程序的ViewState

   <pages enableViewState="false">


ASP.NET 状态管理(视图状态 ViewState)

无论 Web 程序框架多么先进,它都不能改变一个事实:HTTP是一种无状态协议。        每次 Web 请求后,客户端和服务器端断开,同时 ASP.NET 引擎释放页面对象。这种架构保证了...
  • dragon_ton
  • dragon_ton
  • 2015年09月27日 23:44
  • 639

未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。

在Asp.net 2.0 中,动态变化页面的控件时,会出现如下错误:能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发...
  • xinleicn
  • xinleicn
  • 2009年10月17日 11:22
  • 4883

ASP.NET服务器控件之视图状态

为Web页面及其控件保持状态信息是非常有必要的。然而,由于Web应用程序创建于HTTP协议的顶层,这是一个无状态的协议,因此,保持状态信息则变得非常困难。为了解决这个问题,ASP.NET 2.0技术提...
  • High_Mount
  • High_Mount
  • 2007年03月18日 00:21
  • 735

验证视图状态 MAC 失败的解决办法

昨天用户反应系统中有问题,问题就在于翻页的时候,系统会报以下错误。但是我们的系统已经上线1年多了,从来没出现过错误,怎么会出现错误呢? 于是开始检测,查找原因。 1. 出错提示 “/”应...
  • songkexin
  • songkexin
  • 2015年03月19日 15:54
  • 2193

.net 错误:动态加载控件时出现错误:未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。

.net 错误:未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型...
  • liuyunfan
  • liuyunfan
  • 2010年08月12日 19:02
  • 2129

验证视图状态MAC失败的解决办法

在网上搜寻了很久看了很多关于MAC验证视图状态失败的解决方法。大部分人都说是在页里或web.config里加EnableEventValidation="false" EnableViewStateM...
  • liu_zhongjie
  • liu_zhongjie
  • 2010年02月05日 10:01
  • 8059

《ASP.NET本质论》视图状态 ViewState

序列化和反序列化                    对象在内存中以引用的方式相互联结,构成一个复杂的对象数。但是,在外部的设备中,却是以一定的序列保存的,比如,图片文件是以一个有规律的字节序列进...
  • sky1069
  • sky1069
  • 2011年08月08日 17:15
  • 411

Asp.net视图状态的作用

视图状态(view state)是在单个页面中保存信息的第一选择,ASP.NET Web控件也使用试图状态在回发间保存属性值。通过页面内建的 ViewState 属性,你可以把自己的数据放入到视图状态...
  • u010953886
  • u010953886
  • 2013年08月27日 06:48
  • 597

保存你的RCP视图状态

每当做开发的时候,你有可能在一次调试程序的过程中打开很多个编辑器,或是对Eclipse默认的视图布局不满意,手工作了一些调整。如果在工作的过程你因为有事离开或是不小心把Eclipse关掉了,不用担心...
  • soundyrose
  • soundyrose
  • 2010年05月19日 19:27
  • 932

验证视图状态 MAC 失败(转)

刚修复好一问题,又来这个问题,搜索到了这个解决方法,感觉不错。 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在...
  • dhttaso
  • dhttaso
  • 2010年11月03日 17:20
  • 5717
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET页面——视图状态
举报原因:
原因补充:

(最多只允许输入30个字)