ASP.NET进阶(2):IsPostBack和BindForm
说明:本文里会使用InputId为控件的ID,InputName控件的name,InputId.Text控件的值,UrlPramaName Url参数名,BindForm()绑定表单的方法。以后还会使用一些伪代码,和这种“未声明”的代码。尽量单词达意。
Request.Form
可能有同学会问为什么你用Request.Form["InputName"]啊,我们都是用InputId.Text,我们只是用Request.QueryString["UrlPramaName"]来获取Url的参数值。 事实上,这两种方式都是可以的,而且通常控件生成的Html代码里Id和Name值也都是一样的(其实这并不好,以后会讲)。当点击提交按钮后,页面被重新加载,并且给控件赋了值。所以,InputId.Text就可以获取到具体控件的值。
问题是控件是被怎么赋值的?你知道吗?
IsPostback
为什么页面第一次加载的时候IsPostback是false,而提交之后变成了true,我们上节不是说post也是页面请求吗,怎么两次请求,IsPostback值却有变化呢?
当我们的form被提交后,浏览器会帮我们把form里的控件的值post到form的action所指向的页面(一般也是本身页面)。这时,IIS收到请求和Post数据后,便会知道是提交数据,而不是像第一次打开(刷新其实和第一次打开是一样的),没有数据。所以,后台类(PageName.aspx.cs)在执行过程中的时候会把IsPostback设置为true! “Is Post Back”的含义即是“是否提交后(的请求)”的意思。
所以往往我们写按钮的Click事件时,在Page_Load方法里经常会 if(!IsPostBack) BindForm();//给表单所有控件赋值的方法。意思是提交后我就不绑定表单了,而是走Click的具体事件方法。
为什么刷新的时候按钮没有执行click事件,而提交后就可以了呢?
因为第一次加载(普通请求)的时候按钮的Click事件没有订阅方法,而点击提交后,按钮的Click事件订阅了具体的事件方法。就像IsPostback一样,相当于按钮的成员被赋值了。
BindForm
【注意】为什么不再绑定表单? 其实逛逛CSDN,大家会发现很多人都会问一个问题————为什么他明明修改了控件的值,但是提交后数据没变呢? 然后很多人回帖说,加一个IsPostback判断! 你知道为什么要加了吗? 呵呵,因为如果再次执行bindform的话,控件的值会被重新赋值,那么你再运行按钮事件时就会取到旧的值。
那么,为什么我不执行BindForm,form在提交后(刷新了)页面的控件依然有值呢? 这不是很奇怪?
呵呵,其实这当然是有值的了,不然你在往数据库写记录的时候InputID.Text 的数据哪里来的,而且你的BindForm不外乎就是给InputId.Text = "xxx" 赋值么 :)。