在写这篇文章之前,我想先声明一句:我在编程方面先接触的 WinForm 然后才是 WebForm 。记得转向 Web 的时候,我很郁闷的是为什么每次 Ajax 调用和提交的时候,后台代码中的属性总是 null 值……
在 WinForm 的年代,在类中如果我需要一个变量,通常我是将它写成属性,然后就可以在赋值后“一直”使用到地老天荒;但是在 Web 大行其道的今天我一直很困惑:页面后台的属性赋值之后,再次访问就成了 null 值(缺省值,不一定是 null )!
经过一段时间之后,虽然搞明白了原理,但是还是很想 WinForm 中的那种方式,太方便了!!!难道伟大的 Web 做不到吗?问题虽然提出来了,就可以分析分析了。既然 Asp.Net 不帮我们解决这事情,我们自己可以 DIY 。
WebForm 的控件状态其实是放在 ViewState 里面,在页面的生存周期内,Page_Load 之前加载控件状态,在 SaveViewState 中保存控件状态;而对于我们定义的属性、字段,其实 Asp.Net 没有做任何处理,所以在下一次访问的时候就成了 null 值。
如果将自定义的属性,在 Page_Load 之前手工加载,在 SaveViewState 中手工保存,是不是我们就可以完成这个任务了呢?我们可以做一下实验:
实验的后台源码如下:
class _Default : System.Web.UI.Page
2: {
public Person CurrUser { get; set; }
4:
#region Auto Load And Save
void OnLoad(EventArgs e)
7: {
base.OnLoad(e);
9:
if (Page.IsPostBack)
11: {
];
13: }
14: }
15:
object SaveViewState()
17: {
base.SaveViewState();
19:
] = CurrUser;
21:
return obj;
23: }
#endregion
25:
object sender, EventArgs e)
27: {
if (!Page.IsPostBack)
29: {
};
31:
32: Page.DataBind();
33: }
34: }
35:
object sender, EventArgs e)
37: {
+ CurrUser.Name);
39: CurrUser.Name = txtName.Text.Trim();
+ CurrUser.Name);
41: }
42: }
43:
class Person
45: {
int ID { get; set; }
string Name { get; set; }
48: }