我有一个非常简单的网页,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的例子是什么?除了控制值之外,我无法从表单中看到您需要的内容。
答案 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表单回发的控件以及动态添加或填充的控件。
扫描到文档的该部分,您应该找到所需内容。