ViewState不需要保留控件值,那么它的作用是什么?

时间:2011-10-07 06:35:59

标签: asp.net viewstate

我有一个非常简单的网页,ViewState在所有地方都被禁用:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" EnableViewState="false" %>

<!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">

<body>
    <form id="form1" runat="server">
    <div>

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

    <asp:DropDownList runat="server"  id="mylist" EnableViewState="false">
    <asp:ListItem>my item 1</asp:ListItem>
    <asp:ListItem>my item 2</asp:ListItem>
    <asp:ListItem>my item 3</asp:ListItem>
    <asp:ListItem>my item 4</asp:ListItem>
    <asp:ListItem>my item 5</asp:ListItem>
    <asp:ListItem>my item 6</asp:ListItem>
    </asp:DropDownList>

    <asp:Button runat="server" Text="click me"/>

    </div>
    </form>
</body>
</html>

背后的代码

public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
      Response.Write("Dropdown list value is " + mylist.SelectedValue);

    }
}

正如您所看到的,没有启用任何视图状态,但它确实保留了控件值,请参阅此处了解正在运行的示例http://www.yart.com.au/stackoverflow/viewstate/test.aspx

修改

latr0dectus在某种程度上回答了我的问题。但实际上需要ViewState的例子是什么?除了控制值之外,我无法从表单中看到您需要的内容。

2 个答案:

答案 0 :(得分:5)

  

@Petras:不需要ViewState来保存控件值,那么它是什么   办?

实现IPostBackDataHandler的控件使用LoadPostData()方法分配给某些属性。

阅读这篇文章:Understanding ASP.NET View State

  

查看状态的开发人员中常见的误解   以某种方式负责TextBox,CheckBoxes,DropDownLists,   和其他Web控件在回发时记住它们的值。这是   不是这样,因为价值是通过回发表单字段标识的   值,并在LoadPostData()方法中为这些控件分配   实现IPostBackDataHandler。

答案 1 :(得分:1)

我不确定你的问题是什么。

在页面生命周期中使用视图状态。页面提供后,它将在服务器上销毁。然后浏览器回发它也回发了视图状态。服务器可以将此与已发布的表单值结合使用,以重新创建页面的先前状态,然后显示更改。

在某些情况下,即使禁用了viewstate,某些控件也会像启用了viewstate一样工作。这是因为某些控件具有所谓的“控制状态”。它的运行方式与viewstate类似,但不能禁用。这是因为如果没有它,某些控件将无法正常运行。

在您发布的示例中,我认为您正在观察在回发期间将下拉列表的选定值发布到服务器。不是它是从viewstate重建的。

我添加了以下链接中找到的这些信息: http://aspnetresources.com/articles/ViewState

  

这个故事的寓意是什么?您并不总是需要启用视图状态来维护页面状态。 “我什么时候需要它?那么它有什么用?”很高兴你问。参与视图状态的主要候选者是那些不通过HTTP表单回发的控件以及动态添加或填充的控件。

扫描到文档的该部分,您应该找到所需内容。