ViewState的作用是什么?如何理解和使用ViewState?

fly_miss 2008-05-14 02:44:30
我所知道的:
ViewState用来保存往返页面和控制值,从而可以使新请求的页面恢复为提交页面的状态。
ViewState以加密方式保存在隐藏字段__ViewState__中

但是我有很大的疑问:
1>为什么TextBox的Color,MaxLength等属性也保存在ViewState中?(反编译可以看到)
2>TextBox的Text值本来就会回传到服务器,还为什么要保存在ViewState中?(类似有Select的value等)
3>由于1>2>,ViewSate到底有什么用?

200分求答案。可以比较详细的说明ViewState的用法的话,可以加分。代码只要说明问题即可,不要复制和粘贴一大堆。
...全文
391 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nnoovvee 2008-05-16
  • 打赏
  • 举报
回复
学习
davidxu1969 2008-05-14
  • 打赏
  • 举报
回复
Web窗体是无状态的。

要保留某些状态必须用到ASP.NET的内置对象。

在ASP.NET页面间传递数据的方式有几种:

1.传递数据给页面本身
使用ViewState对象。
2.传递给当前页面链接到的另一页面
使用Request.QueryString
3.传递给没有直接关联的页面
使用Session、Cookie或全局变量。

如上,ViewState用来给页面本身传递数据用。比如我们有一个变量,值为:100,然后页面放一个按钮,每点一次给这个变量加1,然后显示到一个TextBox中,通常应该是这样的代码:

private int id;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
id = 100;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
id++;
TextBox1.Text = id.ToString();
}
但是,实际运行一下会发现结果不是我们预想的。这是因为:当页面提交或刷新后,由于Web页面的无状态性,这个变量的值会消失,因此通常把它保存到ViewState中,在刷新后从ViewState中取回该值。改用下面的代码:

private int id;
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["id"]==null)
{
id = 100;
ViewState["id"] = id;
}
else
{
id =(int) ViewState["id"];
}
}
protected void Button1_Click(object sender, EventArgs e)
{
id++;
TextBox1.Text = id.ToString();
ViewState["id"] = id;
}
就可以得到我们想要的结果。
alanzhou 2008-05-14
  • 打赏
  • 举报
回复
你也可以禁用viewstate,这样可以减少交互数据量,但是你要自己处理所有传递参数了。
Haoze 2008-05-14
  • 打赏
  • 举报
回复
如果Color,MaxLength等不保存在控件状态中的话,如果服务器端对其进行了更改,这个更改是无法保存的。虽然当前的页面对象的状态是正确的,但是再次post的时候,页面对象的状态会丢失。
Haoze 2008-05-14
  • 打赏
  • 举报
回复
第二个问题:

TextBox的Text值的确保存在ViewState中。但是也同时保存在“控件状态”中。

如下:
 protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
base.ValidateEvent(postDataKey);
string text = this.Text;
string str2 = postCollection[postDataKey];
if (!this.ReadOnly && !text.Equals(str2, StringComparison.Ordinal))
{
this.Text = str2;
return true;
}
return false;
}

alanzhou 2008-05-14
  • 打赏
  • 举报
回复
state嘛,当然是用来保存状态的。 主要配合postback功能,有些控件使用自动post功能,其他控件在post后在显示时要保留之前的状态(显示的数据、用户输入的数据)就是靠viewstate了。

你也可以编程使用viewstate, post前放些数据,post后读取。page,服务器端控件都有自己的viewstate.

silkstockings 2008-05-14
  • 打赏
  • 举报
回复
可能我理解的比较浅显:

ViewState用来保存页面状态,就是说提交之后我们还可以看到文本框里面的内容就是ViewState保存的功劳。

ViewState只维护当前页面的状态,不同页面之间不能共享,Session可以。

ViewState你可以理解为一个隐藏控件。
Haoze 2008-05-14
  • 打赏
  • 举报
回复
先回答一个问题
(1)Color,MaxLength等属性为什么要保存在ViewState中?

//自定义控件
public class SampleControl : WebControl{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get;set;
}

#endregion

protected override void Render(HtmlTextWriter writer)
{
writer.Write(Text);
}
}
}


protected void Button2_Click(object sender, EventArgs e)
{
this.SampleControl1.Text = "btn1";
}

protected void Button3_Click(object sender, EventArgs e)
{
}


如果你先点Button2,页面展示btn1。然后你再你认为你点Button3的时候,页面上展示的控件会显示什么呢?ViewState的作用就是用来保持这个btn1的。当前没有使用ViewState保持Text的值,所以页面不会保持btn1
wzy_love_sly 2008-05-14
  • 打赏
  • 举报
回复
mark

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧