日期:2014-05-18  浏览次数:20426 次

关于ViewState的一些问题
以下文字复制来自百度知道,因此排版等...

我实在不知道ViewState和私有字段有什么区别了,网上说的都没有用,什么维持控件状态,还不如给我实际的代码让我测试。
所以说,我不问他们的区别了,我直接问,怎么能实现像TextBox一样,在回传后还能保持输入的东西。
下面是我测试的代码,怎么改才能在文本框中输入字符串后回传还能保持输入的字符串(页面要放一个BUTTON,专门来回发,也就是至少在BUTTON的CLICK事件中获取的到控件的TEXT属性不是原始的了)?
 public class test:WebControl 
  {
  private string text = string.Empty;
  public string Text
  {
  // get{return text;}
  // set{text=value;}
  get {return ViewState["Text"] == null ? string.Empty : ViewState["Text"].ToString(); }
  set { ViewState["Text"] = value; }
  }
  protected override void Render(HtmlTextWriter writer)
  {
  writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
  writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
  writer.RenderBeginTag(HtmlTextWriterTag.Input);
  writer.RenderEndTag();
   
  }
  }

XX回复:
其实,你描述的问题,我真不太明白是啥意思。
随便跟你扯几句吧:
ViewState是保持服务器控件的状态或者保存在当前网页可以访问的全局变量。
private标示和他根本是两回事:
1.
private标示表示的是一个类里面的一个字段,只有该类里面的成员可以访问,针对的是c#语言,不管是什么平台(c/s,b/s,移动);
ViewState只表示b/s平台
2.
ViewState只存在于继承于System.Web以下的类中,
而private是可以存在于任何类中
3.
ViewState保存的内容只在该页面打开的时候存在,而private可以通过该类中的public方法进行访问。比如你定义的这个类,外部可以通过一个公有的方法来修改或者读取text字段,但是是不可以通过任何方法访问到ViewState["Text"]

关于你说的服务器控件回发后保存状态,虽然是用的ViewState,但其关键在于采用了一个hidden控件来保存ViewState保存的服务器控件状态。如果你也想达到这种效果,你给自己的用户控件加个hidden就可以了。或者比较直接的,你的控件继承服务器的button或者在控件里面拖个服务器的button进去,也是可以的 


追问:

没看懂?
我上面的代码是一个服务器控件的雏形,只有Text一个属性,它的作用就是在Render中输出一个文本框。
------------------以上为背景----------------
现在要实现的是,在页面生产的文本框中输入东西,然后页面回发(不管什么回复,比如页面上一个按钮按下时),回发后,1,要能在后台获取文本框中的数据;
2,页面中用户输入的东西不被清空。
其实微软自带的TextBox就行,拖一个加一个Button你测试就知道了。

------解决方案--------------------
你实现IPostEventHandler接口就行了,可以百度下这个借口的用法