当前位置: 首页 > news >正文

ASP.NET中IsPostBack属性

导读:
  通过页面的IsPostback属性,可以检查 .aspx 页是否为传递回服务器的页面;当加载页面并对控件的更改属性处理之前,用户可以在page_Load事件中检查该页面是否被传递回的页面。
  一般是在page_load中检查是否是第一次加载本页或是判断是否是用户提交(PostBack)
  if (!IsPostBack) {
  //do something
  }
  在用DataGrid访问和更新数据库时没有注意到这个问题,会出现各种各样的奇怪问题,比如我的这种.
  问题描述:
  用DataGrid访问和更新数据库(SQL Server --Northwind --table name:categories --Query :select categoryID,categoryName,Description form categories ),除了更新操作以外,其它功能OK.对DataGrid进行如下操作:点击“编辑”,相应的行数据变为可编辑,同时编辑按钮被“更新”和“取消”代替。对数据进行编辑,如把Description中的AAA改为BBB。再点“更新”按钮。本意是想用此方法将修改后的数据(BBB)代替数据库中原有的AAA,当然是用Update方法了。但在点“更新”后,数据没有改变,我做过测试,UPDATE方法是有效的,也就是说,UPDATE方法更新的不是新数据,而是没有修改前的旧数据,造成数据没有更新(实际上是更新了)。要注意的是我的Page_Load事件如下
  private voidPage_Load(objectsender, System.EventArgs e)
  {
  // 在此处放置用户代码以初始化页面
  OleAd.Fill(ds);//OleAd--oledbAdapter
  dg.DataBind();//dg--DataGrid
  }
  分析问题(个人推测,请指正):
  由于没有用IsPostBack判断是否是第一次加载此页面,所以不管什么情况下只要有PostBack,都会对dg(DataGrid)进行数据绑定。所以在进行任何的sumbit后,dg都会去数据库绑定数据而不理会页面中的数据。
  当对选中的数据进行修改完毕后,在点“更新”时,提交此页面修改的数据,而马上遇到Page_Load事件,不等对修改数据进行处理,服务器就先生成原页面(MS用这种方法提高速度?),发现dg.DataBind(),执行之,于是放弃数据库更新,于是看不到更新结果了。
  解决问题:
  解决倒是很简单,Page_Load事件中加上对IsPostBack的判断就可以了。
  private voidPage_Load(objectsender, System.EventArgs e)
  {
  // 在此处放置用户代码以初始化页面
  OleAd.Fill(ds);//OleAd--oledbAdapter
  if(!IsPostBack)
  {
  dg.DataBind();//dg--DataGrid
  }
  }
  
  现在从对ASP.NET页面的执行顺序开始,体会一下B/S结构的程序的特点,下图是ASP.NET页面的执行顺序说明:
  Page_Init(页面初始化引发的事件)——>Page_Load(加载页面时引发的事件)——>Control Event(服务器控件引发的事件)——>Page_UnLoad(页面从内存中卸载时引发的事件)
  Page_Init和Page_UnLoad不常用,但是这里还是要说明一下。Page_Init和Page_Load事件区别在于,只有后者才能完全加载控件,绑定数据,虽然你可以在Page_Init中访问控件,但是其viewstate都不会被加载,所以此时控件中只拥有默认值。
  这里说到了viewstate,我们先来做一个大致的了解——其实在ASP.NET中有两个viewstate。一个是控件本身的,用来维护控件自己的一些状态,比如说某个空间有变色的功能,它的viewstate就维护这个功能,这个viewstate是不能被用户访问的。相信自己写过控件的朋友都会有这样的感觉,自己写控件当然也要用自己的一个viewstate来维护这个控件的状态;而另外一个viewstate,是用户使用的,这个viewstate和Session几乎一模一样,必须要先对其进行定义,才能使用。
  每当点击ASP.NET的Web网页上的Button、LinkButton或ImageButton等控件时,表单就会被发送到服务器上。如果某些控件的AutoPostBack属性被设置为true,那么当该控件的状态被改变后,也会使表单会发送回服务器。?(AutoPostBack属性,它只有两个bool值,true/false。如果这个属性被设置成false,那么点击后就不会立刻将变化传给服务器处理,也就不会有该控件的SelectedIndexChanged事件。)
  每次当表单被发送回服务器,就会被重新加载,启动Page_Load事件,执行Page_Load事件处理程序中的所有代码(注意,是每次都会执行!)。
  很显然把网页的初始化代码放在这里是最合适不过。我们经常会希望在每次加载网页时执行一些代码,如一些控件的数据绑定。
  当我们希望只有在网页第一次加载时执行另一些代码(基本上都是数据的默认绑定),甚至希望一些代码在除首次加载外的每次加载时执行。那么我们可以利用IsPostBack特性来完成这一功能。在网页第一次加载时,该属性的值是false。如果网页因回送而被重新加载,IsPostBack属性的值就会被设置为true。
  在ASP.NET应用程序中,如果需要在页面第一次显示时执行一些初始化操作,必须判断IsPostBack属性!
  在ASP.NET使用Page.IsPostback,那么就可以避免往返行程上的额外工作:如果处理服务器控件回发,通常需要在第一次请求页时执行代码,该代码不同于激发事件时用于往返行程的代码。如果检查?Page.IsPostBack?属性,则代码可按条件执行,具体取决于是否有对页的初始请求或对服务器控件事件的响应。这样做似乎很明显,但实际上可以忽略此项检查而不更改页的行为。该属性用的好坏,直接关系到你程序运行是否按照你最初的意愿,也关系到整个页面的效率。因为,如果每次都会给控件绑定数据,不管你是第一次访问,还是提交了数据以后,那么这个页面程序的效率可想而知。
  一个B/S结构的页面每一次提交,它都会重新从头到尾执行一次。而C/S结构的程序就不会这样,这是和C/S结构的程序最大的区别!? 其实,得不到控件的数据,都是因为这个原因。

本文转自
http://blog.csdn.net/cjjky/archive/2007/05/06/1598328.aspx

相关文章:

  • 模仿Gmail右上角的Loading
  • 什么是数字信封?
  • - 转 Ext2.0 form使用实例
  • Ext的layout页面布局解析[转]
  • 【原创】Ext 上传文件,前后台实现, Asp.net 代码
  • jsp request,正确使用. 为什么不能使用 getAttribute 得到保存的数据
  • html 另存为/打印/刷新/查看原文件等按钮的代码!!!
  • 四川汶川地震感言
  • Oracle 导入数据库备份 dmp 文件
  • 丫头的拜托
  • 祝福远方的妹妹高考成功
  • 妹妹的高考,续 ----呵呵,妹妹高考上一本线了,恭喜中.....
  • 妹妹高考续--录取了
  • 163.com 网易的房产频道也会乱码,质疑开发人员和测试人员 http://sh.house.163.com/ !!
  • web.xml中配置spring
  • github从入门到放弃(1)
  • Js基础——数据类型之Null和Undefined
  • Vue UI框架库开发介绍
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 订阅Forge Viewer所有的事件
  • 基于axios的vue插件,让http请求更简单
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 记录:CentOS7.2配置LNMP环境记录
  • 漂亮刷新控件-iOS
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用 @font-face
  • 跳前端坑前,先看看这个!!
  • 用 Swift 编写面向协议的视图
  • 用Visual Studio开发以太坊智能合约
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # C++之functional库用法整理
  • ${ }的特别功能
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (七)Knockout 创建自定义绑定
  • (四) 虚拟摄像头vivi体验
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net程序集学习心得
  • .NET是什么
  • @Bean有哪些属性
  • [bzoj2957]楼房重建
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [flask]http请求//获取请求体数据
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [java进阶]——方法引用改写Lambda表达式
  • [jobdu]不用加减乘除做加法
  • [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟
  • [nowCoder] 两个不等长数组求第K大数
  • [office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记