首页 > 代码库 > 关于IsPostBack

关于IsPostBack

我们在写程序时,后台代码的Page_Load()事件中总是习惯的写上if(!IsPostBack){},然后写些代码逻辑,但自己对于为什么要有这个判断,或者说这个判断是否是必须的,以及何时不走里边的代码总是有些不确定,于是花点时间上网详细了解下做个总结。

一.IsPostBack的定义:  获取一个值,该值指示当前页面是首次加载还是为了响应客户端回发事件而加载

定义的很清晰,略加分析:就是说这是一个bool值,如果我们是第一次访问当前页面,这个bool值为false(不是回发加载),当我们触发页面某个能触发回发事件的事件时,这个bool值为true(是回发加载),那哪些事件能触发回发事件呢?

两类:

1>服务器端Button控件 从浏览器中查看源码可以看到:该控件被渲染成type=Submit的input标记,同时,其所在的form标记(runat=server),以被添加两个属性:Action="本页面",method="post" 这就是说,点击按钮,其所在的表单被默认提交到该页面后台--这是一类postback

2>被标记为 AutoPostBack="true" 的其他服务器控件,能自动触发postback

★触发过程:先走Page_Load() 如果定义了该控件的某些事件,如dropdownlist的selectedIndexChanged,button的click事件,再走该事件

我们经常在页面初次加载时绑定一些数据(如下拉框的数据),如果没有定义if(!IsPostBack){下拉框的数据绑定},页面就会在每次postback的时候再次访问Page_Load(),再次绑定数据,首先是效率降低(每次访问该页面都要加载一遍数据),而且有可能会出错(比如,定义了dropdownlist的selectedIndexChanged事件,想在里边对选中的值进行处理,结果触发该事件后却在Page_Load()将数据重新绑定,导致选择值丢失!)

所以,页面加载事件中写if(!IsPostBack),不应该仅仅是一种习惯,更应该是体会到其作用,这样才能使我们的程序按照预想的流程跑下去

PS:并不是每次页面刷新IsPostback=false 都成立

当页面首次加载时IsPostback=false 下面要分情况了:
①没有点击页面任何回发请求的按钮或事件(如设置为autopostback=true的dropdownlist的selectedIndexChange事件),刷新页面,此时IsPostBack=false依然成立(没有过回发请求的刷新页面,一直都是首次加载页面)
②如果触发①中所述事件后再次刷新页面,此时IsPostBack=true,既页面已经做过回发请求,此后再刷新页面都是重复之前的回发请求,正如我们买东西下订单,提交一次后如果再次刷新页面就成了重复提交表单,当然浏览器都会针对这种情况有提示消息,但我们自己也应该明白并避免这种操作。

 

关于IsPostBack