极念网欢迎您!
ASP.NET IsPostBack属性剖析
作者:李社河来源:CSDN发布时间:2014/5/10 14:00:47查看数:61924

   ASP 是一项微软公司的技术,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术指 Active Server Pages(动态服务器页面),运行于 IIS 之中的程序 。

   在学习ASP.NET视频中,先了解刚开始最先接触的就是窗体加载事件,当我们第一次浏览器请求服务器时会会执行Page_Load,在非第一次请求的时候也会执行Page_Load。为什么对同一个Form有多次请求呢?asp.net中引入了服务器端事件,支持服务器端事件的控件,会发出对当前Form的请求,这样在很多情形下我们就需要区别是否是对这个Form的第一次请求。解决这个问题我们引入了PostBack的IsPostBack属性:

    在深究该属性之前我们先区分PostBack的IsPostBack的区别:由aspx的页面回传机制的基础知识得知 postback是回传即页面在首次加载后向服务器提交数据,然后服务器把处理好的数据传递到客户端并显示出来,就叫postback, ispostback只是一个属性,即判断页面是否是回传,if(!Ispostback)就表示页面是首次加载,这是很常用的一个判断方式.一个页面只能加载一次,但可以在加载后反复postback

     IsPostBack是Page类有一个bool类型的属性,用来判断针对当前Form的请求是第一次还是非第一次请求。当IsPostBack=true时表示非第一次请求,我们称为PostBack,当IsPostBack=false时表示第一次请求。在asp.net框架内部有很多的场景需要判断IsPostBack,比如LoadAllState等操作就需要在PostBack的时候进行。对于我们自己使用WebForm进行开发时,经常会在Page_Load中对IsPostBack进行判断,因为第一次请求的时候会执行Page_Load,在非第一次请求的时候也会执行Page_Load。为什么对同一个Form有多次请求呢?asp.net中引入了服务器端事件,支持服务器端事件的控件,会发出对当前Form的请求,这样在很多情形下我们就需要区别是否是对这个Form的第一次请求

代码解析:

1、对于使用Server.Transfer进行进行迁移时迁移到的页面其IsPostBack=false 每次刷新页面都是第一次加载页面;

2.  Post方式如果Request中没有请求值,即Request.Form =null则IsPostBack=false;Get方式如果Request中没有请求值,即Request.QueryString =null则IsPostBack=false。

namespace Example   
{   
    public partial class WebForm1 : System.Web.UI.Page   
    {   
        protected void Page_Load(object sender, EventArgs e)   
        {   
            if (!IsPostBack)   //不是回传即第一次加载页面传过来的值为空   
            {   
                if (Request.QueryString["id"] != null)   
                {   
                    Response.Write("回传");   
                }   
   
                else   
   
                {   
   
                        Response.Write("不是回传");   
   
                 }   
            }   
            
        }   
   
    
   
        protected void button1_Click(object sender, EventArgs e)   
        {   
            Response.Redirect("WebForm1.aspx?id=3 ");   
        }   
    }   
}

3.使用Response.Redirect方式向自画面迁移时,此时IsPostBack=false

4.发生跨页提交(CrossPagePostBack),当访问PreviousPage属性的时候,对于源Page,IsPostBack=true。发生跨页提交(CrossPagePostBack)时目标页面是IsPostBack=false。

5.使用Server.Execute迁移到的页面其IsPostBack=false。


Server.Execute和Server.Transfer的区别

Server.Execute("another.aspx")和Server.Transfer("another.aspx")区别: 
Execute是从当前页面转移到指定页面,并将执行返回到当前页面 
Transfer是将执行完全转移到指定页面

实例1:

namespace Example   
{   
    public partial class WebForm1 : System.Web.UI.Page   
    {   
        protected void Page_Load(object sender, EventArgs e)   
        {   
            if (!IsPostBack)   //不是回传即第一次加载页面传过来的值为空   
            {   
                if (Request.QueryString["id"] != null)   
                {   
                    Response.Write("回传");   
                }   
   
                else   
   
                {   
   
                        Response.Write("不是回传");   
   
                 }   
            }   
            
        }   
   
    
   
        protected void button1_Click(object sender, EventArgs e)   
        {   
            Response.Redirect("WebForm1.aspx?id=3 ");   
        }   
    }   
}

       假设在page_load()里定义textbox为空,在button_click事件里给写一段往数据库存textbox的值.当用户往 textbox里输入值以后,点击button时,就应该可以把往textbox里输入的值存到数据库里.可实际上,当点击button的时候,系统会自动先重新执行page_load(),也就是把柄textbox清空,再执行click 事件,你往数据库里存的值永远都是空.所以要在page_Load() 里加入if(!IsPostBack).

二、解决编辑数据时数据更新的数据原来的,无法修改的问题

解析:因为当后台编辑数据时,先从后台查询出需要编辑的数据,此时是在不是回传的情况下从数据库查询出数据,当编辑完数据之后,点击提交按钮,提交数据,此时如果没有判断是否回传,会再次查询原来的数据,造成编辑数据没有改变。

namespace Example   
{   
    public partial class WebForm1 : System.Web.UI.Page   
    {   
        protected void Page_Load(object sender, EventArgs e)   
        {   
            if (!IsPostBack)   //不是回传即第一次加载页面传过来的值为空   
            {   
   
    
   
            }   
            if (Request.QueryString["id"] != null)   
            {   
                Bind();   
            }   
            else   
            {   
                Response.Write("<script>alert('数据发生改变')</script>");   
            }   
             
        }   
        public void Bind()   
        {   
            Response.Write("数据");   
        }   
        protected void button1_Click(object sender, EventArgs e)   
        {   
            Response.Redirect("WebForm1.aspx?id=3 ");   
            //Server.Execute("WebForm2.aspx?id=3");   
        }   
   
    
   
        protected void CesH_Click(object sender, EventArgs e)   
        {   
            Label1.Text = "测试";   
        }   
    }   
}

IsPostBack结论学习总结
  
  ① 对于使用Server.Transfer进行迁移时迁移到的页面其IsPostBack=false。
  
  ② Post方式如果Request中没有请求值,即Request.Form =null则IsPostBack=false;Get方式如果Request中没有请求值,即Request.QueryString =null则IsPostBack=false。
  
  ③ 如果QueryString或Form虽然有请求值,但是QueryString或Form中的Key没有&ldquo;__VIEWSTATE&rdquo;和&ldquo;__EVENTTARGET&rdquo;和&ldquo;__VIEWSTATEFIELDCOUNT&rdquo;,并且没有键为&ldquo;null&rdquo;,值以&ldquo;__VIEWSTATE&rdquo;开头并且也没有值为&ldquo;__EVENTTARGET&rdquo;的键值对,则IsPostBack=false。
  
  ④ 使用Response.Redirect方式向自画面迁移时,此时IsPostBack=false。
  
  ⑤ 发生跨页提交(CrossPagePostBack),当访问PreviousPage属性的时候,对于源Page,IsPostBack=true。
  
  ⑥ 发生跨页提交(CrossPagePostBack)时目标页面是IsPostBack=false
  
  ⑦ 使用Server.Execute迁移到的页面其IsPostBack=false。
  
  ⑧ 在Page运行期间其对应的DLL被更新了并且Page的树结构发生过变化,这种情况下请求时IsPostBack=false。

  
  可以这样来理解这些结论:一般情况判断Request中如果没有请求值则IsPostBack=false。如果有请求值但是不包括&ldquo;__VIEWSTATE&rdquo;等一些特殊的键或值,则IsPostBack=false(每次请求后.Net框架会将一些特殊的隐藏域&ldquo;__VIEWSTATE&rdquo;等返回给客户端)。还有一些特殊的情形是上面的规则不能正确判断的需要特殊处理的,这些情形包括Server.Transfer,Response.Redirect,CrossPagePostBack,Server.Execute,发生了页面元素变化及重新编译。
 

作者:李社河
出处:http://blog.csdn.net/lishehe/article/details/9027365