`

什么是ViewState,在何处可以禁用ViewState

 
阅读更多
【考点】
ViewState的理解。
【出现频率】
★★★★☆
【解答】
ViewState用于保存页面中所有控件的回传时的状态数据,使WebForm程序类似于WinForm程序一样工作。ViewState可以在控件级别,页面级别,程序级别及全局配置中设置ViewState是否禁用,ViewState默认是启用的。
【分析】
本题主要考查面试者对ViewState的认识。ViewState也称为视图状态,ASP.NET使用ViewState这种机制来跟踪服务器控件状态值,否则这些值将不作为WEB窗体的一部分而回传。即页面中的控件被编程或用户填值等方式改变了状态后,当页面发生回传,这些状态仍然可以保持。因此,除了可以减少烦琐的工作和代码外,ViewState还可以减少数据库的读取频率。
在*.aspx页面中,如果form元素的“runat”属性值为“server”(这是VS 2005/VS 2008创建ASP.NET页面时的默认设置),该页面所生成的HTML页面即具备了ViewState的功能。ViewState具体表现为form元素中被添加一个隐藏的“id”属性为“__VIEWSTATE”的隐藏字段,这个字段中存放了所有控件在ViewState中的状态值。这个隐藏字段中的数据是64位编码的字符串,包含了一个集合,该集合中保存了当前页面上所有服务器控件的名称/值对,编程者可以编程通过ViewState访问这些值。
注意:ViewState不负责存储TextBox、Checkbox、CheckBoxList、RadioButtonList等这些实现了IPostBackDataHandler接口的控件所更改的状态值。在页面周期中的初始化过程(即Page_Init()事件后)中,在LoadViewState的事件中Page类从“id”属性为“__VIEWSTATE”的字段中为诸如启用了ViewState的控件装载值。紧接着,LoadPostBackData事件被触发,Page类从HTTP提交的头部信息中装载实现了IPostBackDataHandler接口的控件(如TextBox)状态值。当TextBox控件的“TextMode”属性为“Password”时,无法保存状态值(安全需要)。
如果页面仅用于回传,则页面内自定义的其他数据也可以存储于“id”属性为“__VIEWSTATE”的隐藏字段中。编程者只需直接访问ViewState属性即可,该属性返回了System.Web.UI.StateBag类对象的访问,可利用该对象的索引器以名称/值对的方式存取自定义数据。
在VS 2008中添加新的WEB窗体项到NetWeb项目,并命名为ViewState.aspx。,编写ViewState.aspx如代码11.12所示。代码11.12  ViewState测试页面:ViewState.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ViewState.aspx.cs" Inherits="NetWeb.ViewState" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:TextBox runat="server" ID="tb" EnableViewState="false"></asp:TextBox>
      <br />
      <asp:Button runat="server" ID="btn" Text="回传页面" />
      <hr />
      TextBox的Text属性值:<asp:Label runat="server" ID="lb1"  EnableViewState="false"></asp:Label>
      <br />
      自定义视图状态数据:<asp:Label runat="server" ID="lb2" EnableViewState="false"></asp:Label>
    </div>
    </form>
</body>
</html>
以上页面代码中添加了1个TextBox、1个Button和2个Label控件,并且将Button控件以外的3个控件设置了禁用ViewState。编写ViewState.aspx.cs如代码11.13所示。代码11.13  ViewState测试逻辑代码:ViewState.aspx.cs
using System;
………………………

namespace NetWeb
{
    public partial class ViewState : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //第1次加载页面时将tb控件的Text属性值赋值给lb1控件
            //同时将tb控件的Text属性值赋值给自定义视图状态的“MyWord”项中
            if (!IsPostBack)
            {
                this.tb.Text = "TextBox的Text属性值";
                this.lb1.Text = this.tb.Text;
                this.ViewState["MyWord"] = this.tb.Text;
            }
            //每次加载页面都将自定义视图状态的“MyWord”项值赋值给lb2控件
            this.lb2.Text = (string)ViewState["MyWord"];
        }
    }
}
如以上代码所示,TextBox控件保存的属性值完全不受ViewState被禁用的影响,而Label控件由于ViewState被禁用,所以回传页面后丢失了“Text”属性值。自定义视图状态的数据在每次回传页面后都一直被lb2控件显示出来,虽然lb2控件也被禁用了ViewState,但是自定义视图状态的数据赋值操作在每次页面加载时都会进行一次。
在解答中还提及了禁用ViewState多种方法,不同方法对应着不同的禁用范围。除了以上例子中直接在服务器控件标签中设置“EnableViewState”属性为“false”,还可以在@Page指令中设置这个属性以达到页面级禁用ViewState的目的。禁用整个WEB应用程序ViewState,修改Web.config中相应元素的属性即可,最后,禁用服务器全局的ViewState,修改.Net Framework安装目录下的machine.config即可。当禁用了ViewState以后,控件还可以通过control state(控件状态)保存状态数据,该属性一般用于自定义控件。
说明:ViewState只在页面内有效,不能跨页面使用。
分享到:
评论

相关推荐

    asp.net服务器端保存viewstate例子,html中不在有viewstate

    一种可能的方法是使用Session对象,它可以在服务器端存储用户的特定信息,并且在回发期间仍然可用。 以下是一个简单的示例: 1. 创建一个自定义控件,继承自`System.Web.UI.Control`,并重写`LoadViewState`和`...

    ViewState工具.rar

    2. 查看控件状态:通过解析ViewState,开发者可以查看服务器控件在不同postback之间是如何保持其状态的,这对于调试和优化代码非常有帮助。 3. 保存字符串信息:在描述中提到,该工具具有保存字符串信息的功能,这...

    理解ASP.NET的ViewState

    对于不需要状态持久化的控件或页面,可以禁用ViewState以减少网络传输量。这可以通过设置控件或页面的`EnableViewState`属性为`false`来实现。 #### 指定ViewState的持久化位置 除了默认的隐藏表单字段之外,还可以...

    ViewState 查看工具

    通过工具,开发者可以检查哪些控件的ViewState过大,考虑是否可以禁用或优化,以减少网络传输的数据量,提高页面加载速度。 3. **安全审计**:ViewState数据是加密的,但并非完全安全。查看工具可以帮助开发者确认...

    .net 中viewstate的原理和使用

    但需要注意的是,并非所有控件都支持禁用ViewState。 #### 使用ViewState存储数据 在实际开发过程中,ViewState还可以被用来存储数据。具体来说,可以通过以下几种方式操作ViewState: - 设置数据:`ViewState...

    ASP.NET ViewState 初探

    此外,ViewState还可以减少对数据库的访问,因为某些数据可以在客户端保持,而不是每次需要回传时都重新从数据库获取。 然而,ViewState并非总是必要的。在某些场景下,例如页面不需要保持状态,或者为了优化性能和...

    viewstate实验

    - **跨页面共享**:在分步表单或导航结构中,ViewState可以在页面之间传递部分信息。 3. **使用ViewState的缺点** - **增大页面大小**:由于ViewState包含所有控件的状态,这可能导致HTML响应变大,增加网络传输...

    ViewState查看工具

    5. **控制ViewState**:ASP.NET提供了多种方式来管理ViewState,如在控件级别禁用ViewState,使用ViewStateMode属性,或者全局禁用然后按需启用。开发者可以通过工具来检查这些设置的效果。 6. **安全性考量**:...

    .net ViewState解码器

    4. **禁用与优化**:在某些情况下,可以禁用或减少ViewState的使用,例如对于不需要保持状态的控件,或者可以通过其他方式(如Session、Cookie)来保存状态时。 5. **调试技巧**:开发者可以使用ViewStateDecoder21...

    ASP.NET ViewState

    1. **只保存必要的数据**:检查每个控件是否真的需要使用ViewState,对于那些不需要在多个请求间保持状态的控件,可以禁用其ViewState。 2. **压缩ViewState**:通过配置`&lt;pages&gt;`元素下的`compressViewState`属性...

    asp.net 2.0中通过压缩ViewState

    此外,还可以通过其他方式优化ViewState,例如选择性地禁用不需要的控件的ViewState,或者使用ControlState替代ViewState来存储关键信息。控制和管理ViewState的大小对于提高ASP.NET应用的性能至关重要,尤其是在...

    asp.net页面中的viewstate内容解析器

    ViewState的内容是经过Base64编码的,这是一种将二进制数据转换为可打印字符的算法,使得这些数据可以在HTML中安全地传输。由于Viewstate通常包含大量信息,如控件值、控件状态等,因此其大小可能会影响页面加载速度...

    viewstate的应用 vs2005 sql2005

    2. **VS2005中的Viewstate使用**:在VS2005中,开发人员可以轻松地启用或禁用控件的Viewstate。通过控件的EnableViewState属性,可以控制是否保存和恢复控件的状态。此外,还可以通过Page类的ViewState属性访问整个...

    Session,ViewState用法

    3. **禁用ViewState:** ```xml ``` ##### ViewState的注意事项: - **性能:** ViewState会增加页面的大小,尤其是在包含大量控件的页面上。可以通过压缩或优化来减轻这一问题。 - **安全性:** 默认情况下,...

    viewstate压缩算法源码

    在某些情况下,完全禁用ViewState或使用其他方法(如Session或QueryString)来管理状态可能是更优的选择。 综上所述,理解并应用ViewState压缩算法对于优化ASP.NET web应用程序的性能至关重要。开发者需要根据具体...

    内置对象application,session,cokie,viewstate的区别与session详解

    若不需要此功能,可以通过设置`EnableViewState`为`false`来禁用。 示例代码: 传统的ASP.NET页面中,`ViewState`默认开启,允许用户在表单提交后仍能看到之前的输入。在新的ASP.NET方式下,`ViewState`会自动处理...

    asp.net 禁用viewstate在web.config里

    标题所提及的"asp.net 禁用viewstate在web.config里",指的是在全局级别禁用整个应用程序中的ViewState,而不是单独在每个页面中设置。这可以通过在`web.config`配置文件中修改`&lt;pages&gt;`元素的属性来实现。 以下是...

    ViewState["View"] 使用

    在代码示例中,我们可以看到如何手动操作ViewState来存储和检索自定义数据。首先,创建一个字符串数组`searchList`,并初始化其四个元素为空字符串。然后,将这个数组存储在ViewState中,键名为"view": ```csharp ...

    HiddenField/ViewState/ControlState

    `HiddenField`是一个HTML控件,它在网页上不可见,但其值可以在客户端和服务器之间传递。通过设置`HiddenField`的`Value`属性,可以存储任何类型的数据,只要这个数据能够转换为字符串。例如,当用户提交表单时,`...

    viewstate 服务器端存储或者压缩

    3. **ViewState管理**:除了压缩,我们还可以选择性地禁用或裁剪不需要的ViewState,比如对于不涉及状态变化的控件。`ViewStateFilesPage.cs`可能是一个用于处理大量文件上传场景的页面,其中可能涉及到对ViewState...

Global site tag (gtag.js) - Google Analytics