来源:孟子E章 | 2007-6-7 | (有4056人读过)
在页面回传间通信,ASP中一般利用窗体的属性和 session 来存放数据,在 ASP.NET 中也可以使用 ViewState 对象来做同样的处理。 在ViewState存放数据: ViewState[key]= value; 或 ViewState.Add(key,value); 取出数据: TempStr =ViewState[key]; key不存在时返回空。 不能通过ViewState对象来访问控件的值。 动态建立控件的ViewState: 当需要动态地建立一个服务器控件,如下建立了一个 RadioButton 控件并加入到窗体控件集合中: RadioButton rb = new RadioButton(); Page.Controls[1].Controls.Add(pc); 上面的代码增加一个控件到控件集合末,同样也可以插入到已有控件中的任何位置。 RadioButton rb = new RadioButton(); Page.Controls[1].Controls.AddAt(1,pc); 通常,这些动态生成的控件的状态也需要生成到 ViewState 中去,但这个功能并没有完全实现,特别是生成的控件插入到已有的控件中时。 当动态生成控件和已有控件并存时 ViewState 的结果是不可预料的。在页面回传时,首先非动态生成的控件在ASPX页中被生成,并在 Page_Init 和 Page_Load 事件中读取 ViewState。当页面的控件读取 ViewState 的值时,那些动态生成的控件却还没有被生成,所以当动态生成的控件被 生成时,页面就会省略掉ViewState或者以剩下或许错误的 ViewState 来填充控件。 所以,当需要插一个动态生成的控件到已有控件中去时,最好把这个控件的 ViewState 通过EnableViewState禁止掉。 提醒: 1. 当存在页面回传时,不需要维持控件的值就要把 ViewState 禁止。 2. ViewState的索引是大小写敏感的。 3. ViewState不是跨页面的。 4. 为了能包存在 ViewState 中,对象必须是可流化或者定义了 TypeConverter。 5. 控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。 6. 在页面没有回传 或 重定向 或 在回传中转到(transfer)其他页面时不要使用 ViewState。 7. 在动态建立控件时要小心它的 ViewState。 8. 当禁止一个程序的 ViewState 时,这个程序的所有页面的 ViewState 也被禁止了。 9. 只有当页面回传自身时ViewState 才是持续的。
|