对IsPostBack的正确理解

freeflying1222 2009-02-19 10:47:44
查看了一些资料,感觉有点乱,最详细的是这篇,http://www.cnblogs.com/hobe/archive/2008/04/06/1139031.html
分析了各种情况。如transfer,resposnse等(各位先看了再说,不简单的)

但我感觉归纳的不是很好,应该有一个更简单的归纳的。

有高手能知道简单明了的解释一下么?
...全文
415 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeflying1222 2009-03-01
  • 打赏
  • 举报
回复
感谢大家的回复,
对此问题,我在博客里进行了整理和扩展,欢迎大家再深入谈论。
lovehongyun 2009-02-20
  • 打赏
  • 举报
回复
IsPostBack
获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。
注意回发二字

如果是为响应客户端回发而加载该页,则为 true;否则为 false
君黑鲩 2009-02-20
  • 打赏
  • 举报
回复
每当点击Web网页上的Button、LinkButton或ImageButton控件时,表单就会被发送到服务器上。如果控件的AutoPostBack属性被设置为true,如果CheckBox、CheckBoxList等控件的状态被改变后,也会使表单会发送回服务器。
每次当表单被发送回服务器,就会被重新加载,启动Page_Load事件,执行Page_Load事件处理程序中的所有代码。把网页的初始化代码放在这里是最合适不过的了。我们经常会希望在每次加载网页时执行一些代码,而希望只有在网页第一次加载时执行另一些代码,甚至希望一些代码在除首次加载外的每次加载时执行。
可以利用IsPostBack特性来完成这一功能。在网页第一次加载时,该属性的值是false。如果网页因回送而被重新加载,IsPostBack属性的值就会被设置为true。通过测试,可以在任意时候执行指定的代码。下面是相关的C#代码:
protected void Page_Load(Object sender, EventArgs e)
{
// 网页每次加载时,执行的一些操作
if (!IsPostBack)
{
// 网页第一次加载时执行的操作
}
else
{
// 回送时执行的操作
}

// 网页每次加载时执行的操作
}
我们希望尽量不引起回送(每次回送都会要求服务器进行一系列的操作),即使引起回送后。也希望能够执行尽量少的操作。大规模、浪费时间的操作(例如数据库查找)尤其应当避免,因为它们能够延长应用程序的响应时间。


feifeiyiwen 2009-02-20
  • 打赏
  • 举报
回复
明白了,谢谢
chenwei175528 2009-02-20
  • 打赏
  • 举报
回复
mark and up and study
lishuaide0517 2009-02-20
  • 打赏
  • 举报
回复
其实就是第一次展现页面的时候叫Load,第二次以后叫reload,二reload的时候会和server交互,1,就要post部分重要信息,
2,会保留页面全部信息,
说简单了就是检测是否是load罢了
xiaohe185 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaohe185 的回复:]
楼上解释 简单明了
[/Quote]
说10楼的,~~
xiaohe185 2009-02-20
  • 打赏
  • 举报
回复
楼上解释 简单明了
vrhero 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Jinglecat 的回复:]
引用 3 楼 vrhero 的回复:
这个问题其实很简单,搞不清楚说明你的基础知识不够...建议你认真看看HTTP的原理...

就是个GET和POST的区别而已...

GET -> IsPostBack=false
POST -> IsPostBack=true


========

有误!即使 GET 请求也是可以的,用测试如下的代码,注意其中的 method="get"

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.…
[/Quote]
是有这种情况...这其实是利用URI参数__VIEWSTATE模拟POST...微软无关奈何的一种选择...
greatverve 2009-02-20
  • 打赏
  • 举报
回复
if(!IsPostBack)
{
//只要知道这里加入的代码是在网页首次加载时要执行的,就可以了。
//比如
if(Session["uName"]==null)
Response.Redirect("Login.aspx");
}
chuxue1342 2009-02-20
  • 打赏
  • 举报
回复
up!
whycom 2009-02-20
  • 打赏
  • 举报
回复
正常情况下客户端回发ispostback = true ,否则 ispostback = false;但是如何在服务器端确定是回发?毕竟b/s是无状态的,
反编译一下page 类,他的ispostback 是个属性

public bool get_IsPostBack()
{
if (this._requestValueCollection == null)
{
return false;
}
if (this._isCrossPagePostBack)
{
return true;
}
if (this._pageFlags[8])
{
return false;
}
return (((this.Context.ServerExecuteDepth <= 0) || ((this.Context.Handler != null) && (base.GetType() == this.Context.Handler.GetType()))) && !this._fPageLayoutChanged);
}

会发现确定是比较复杂的 ,例如可以通过利用webrequest手动构造http请求,让ispostback =true
Jinglecat 2009-02-20
  • 打赏
  • 举报
回复
1.
为什么有 PostBack 的概念? 实际是因为有 ViewState 的存在,与 HTTP Method 是 Get 还是 Post 并不重要, 两者都可以实现 PostBack

当然 你还是得理解 HTTP Get 与 Post 的不同,这是基础,学生时代就应该懂的了

2.
用我上面的代码提交之后,你会发现浏览器地址栏会类似是下面的长长一段:

http://localhost/WebApp/PostBackVeil.aspx?__VIEWSTATE=%2FwEPDwUKLTg5NzMzMzA4OWRkdZLB5fBOWp5prwInc6i%2BC11cVkU%3D&__EVENTVALIDATION=%2FwEWAgLX7piZDQKM54rGBjorkHeiP%2BV1hIxb4U%2BmI1K1pzkB&Button1=Button

你可以重新打开一个浏览,用上面的地址打开,你会发现 IstPostBack = true

如果你去掉 __VIEWSTATE=%2FwEPDwUKLTg5NzMzMzA4OWRkdZLB5fBOWp5prwInc6i%2BC11cVkU%3D ,你会发现 IstPostBack = false

所以,有点明白了吗? 至于 ViewState 又是另一个非常庞大的主题了,
vlysses 2009-02-20
  • 打赏
  • 举报
回复
PostBack英文解释:Post-发送至服务器,Back-并返回结果。IsPostBack=true,说明当前的操作信息发送至服务器,并要在本页面得到结果;IsPostBack=false,在代码中的真正意思是:本页面没有主动向服务器发送请求,只是服务器接收到浏览器或其他应用的请求而第一次跳转至本页面,这样,在实际应用中我们可以用if(!IsPostBack){}来实现首次加载本页面需要做的,而之后在本页面进行postback操作不能做的事。
Jinglecat 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vrhero 的回复:]
这个问题其实很简单,搞不清楚说明你的基础知识不够...建议你认真看看HTTP的原理...

就是个GET和POST的区别而已...

GET  -> IsPostBack=false
POST -> IsPostBack=true
[/Quote]

========

有误!即使 GET 请求也是可以的,用测试如下的代码,注意其中的 method="get"

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
Response.Write(IsPostBack);
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server" method="get">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>
</html>


cwmwss 2009-02-20
  • 打赏
  • 举报
回复
学习
zjy120 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Dupeng_accp 的回复:]
page_load 是页面加载事件 当页面加载时候该代码就已经运行过了, 譬如 当用户单击登录时候 页面回传 该代码就又执行了一次 就无法获得客户端输入的内容了
[/Quote]
我也在查这个问题,怎么解决呢?
vrhero 2009-02-19
  • 打赏
  • 举报
回复
这个问题其实很简单,搞不清楚说明你的基础知识不够...建议你认真看看HTTP的原理...

就是个GET和POST的区别而已...

GET -> IsPostBack=false
POST -> IsPostBack=true
  • 打赏
  • 举报
回复
page_load 是页面加载事件 当页面加载时候该代码就已经运行过了, 譬如 当用户单击登录时候 页面回传 该代码就又执行了一次 就无法获得客户端输入的内容了
加载更多回复(1)

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧