有关postback

xingshungames 2010-01-30 11:15:58
在写代码的时候经常用到if (!ispostback)

今天突然想到,到底都有哪些情况下才是回发,哪些情况下算是第一次请求。真有点糊涂了!

比如说html页面的表单有这么多种。

1、<form id="form1" name="form1" method="post" action="Default1.aspx"></form>

2、<form id="form1" name="form1" method="get" action="Default1.aspx"></form>

3、<form id="form1" runat="server"></form>

4、<form id="form1" method="get" runat="server"></form>

其中3和4在浏览器上显示的是1和2的样子,他们之间有什么不同?哪些算是回发,哪些又算是第一次请求?

还有一个疑问,就是action=""是不是就指提交到当前页面?
...全文
1573 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
weike021996 2011-07-11
  • 打赏
  • 举报
回复
精彩精彩精彩精彩
周公 2010-01-30
  • 打赏
  • 举报
回复
现在从对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结构的程序最大的区别!? 其实,得不到控件的数据,都是因为这个原因。
wuyq11 2010-01-30
  • 打赏
  • 举报
回复
GET
POST
使用Server.Transfer切换页面时,IsPostBack = false;
post方式下,若 Request 中无值,既Request.Form == null, 则IsPostBack = false; Get方式下,如果Request中无值,既 Request.QueryString == null, 则IsPostBack = false;
Response.Redirect时 IsPostBack = false;
发生跨页提交(CrossPagePostBack),当访问PreviewPage 属性的时候,对于源Page,IsPostBack = true;
发生跨页提交,目标页面的 IsPostBack = false;
Server.Execute时, IsPostBack = false;

http://topic.csdn.net/u/20090219/22/5fd658d1-1366-4c6d-8b61-ad50b368973c.html
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xray2005 的回复:]
简单的理解:在第1次打开页面时,这个是第1次请求.之后,除了JS客户端操作外,其他的服务器控件操作都算是回发.
[/Quote]

这个我知道,但是现在很少用服务器控件,大都是用的html控件,然后通过form,post方式传送到本页面,然后后台获取,进行操作的。这算是回发吗?晕啊晕
xray2005 2010-01-30
  • 打赏
  • 举报
回复
method="post"和method="get"指定提交的方式,在FORM提交的时候,如果不指定Method,则默认为GET请求


表单提交中Get和Post方式的区别有5点

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。
xray2005 2010-01-30
  • 打赏
  • 举报
回复
简单的理解:在第1次打开页面时,这个是第1次请求.之后,除了JS客户端操作外,其他的服务器控件操作都算是回发.
hearyone 2010-01-30
  • 打赏
  • 举报
回复
顶!
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
看了sp1234说的,我明白了不少,剩下的慢慢消化吧,谢谢啦!

[Quote=引用 16 楼 sp1234 的回复:]
Response.Write(Request.Form["txtPass"] + Request.Form["sltVip"] + Request.Form["txtCName"]+IsPostBack);

这是什么呀。随便用字符串跟一个bool值相加,能正确显示你要的结果吗?
[/Quote]

嘿嘿不好意思。。。。我只是想测试下结果。

字符串和bool值连在一起输出应该是正常的吧,虽然不是很好,结果还能是说来的。
HenJiong 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xingshungames 的回复:]
引用 11 楼 henjiong 的回复:
引用 10 楼 xingshungames 的回复:
如果将form表单 加上runat="server",不管method是post还是get,点筛选之后,都输出true,也就是说

是回传的

postback 只存在于本页。。本页 只要是post 就是postback 这下应该没错了。


你看下我8楼的例子,然后是本页,也是post,但是不是回传。。。疯了
[/Quote]

我的意思是 form 加上 runat=server 然后 只要是post 就是postback
postback 只存在于本页 跨页 有跨页的属性不讨论。
  • 打赏
  • 举报
回复
Response.Write(Request.Form["txtPass"] + Request.Form["sltVip"] + Request.Form["txtCName"]+IsPostBack);

这是什么呀。随便用字符串跟一个bool值相加,能正确显示你要的结果吗?
  • 打赏
  • 举报
回复
有的时候我们可以简单认为Post的时候只有提交__VIEWSTATE、__EVENTTARGET这类字段才是IsPostBack状态。
  • 打赏
  • 举报
回复
不是所有Post的情况都是Postback,至少会区分有以下情况:

1. 如果根本没有提交__VIEWSTATE、__EVENTTARGET这类字段,那么是false。但是有了,并不一定是true。还要考虑以下:
2. 当跨页提交,此时asp.net在后台创建目标页面实例时还要再创建原来页面实例,这会判断为true。但是这个处理过程中出错时,则会返回false。
3. 另外一种极其特殊情况(例如在开发特殊的handler的时候)返回false。
4. 否则,返回true。
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
顶啊
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 henjiong 的回复:]
引用 10 楼 xingshungames 的回复:
如果将form表单 加上runat="server",不管method是post还是get,点筛选之后,都输出true,也就是说

是回传的

postback 只存在于本页。。本页 只要是post 就是postback 这下应该没错了。
[/Quote]

你看下我8楼的例子,然后是本页,也是post,但是不是回传。。。疯了
HenJiong 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xingshungames 的回复:]
如果将form表单 加上runat="server",不管method是post还是get,点筛选之后,都输出true,也就是说

是回传的
[/Quote]
postback 只存在于本页。。本页 只要是post 就是postback 这下应该没错了。
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
如果将form表单 加上runat="server",不管method是post还是get,点筛选之后,都输出true,也就是说

是回传的
TalesTen 2010-01-30
  • 打赏
  • 举报
回复
up
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 henjiong 的回复:]
引用 3 楼 xingshungames 的回复:
引用 1 楼 xray2005 的回复:
简单的理解:在第1次打开页面时,这个是第1次请求.之后,除了JS客户端操作外,其他的服务器控件操作都算是回发.


这个我知道,但是现在很少用服务器控件,大都是用的html控件,然后通过form,post方式传送到本页面,然后后台获取,进行操作的。这算是回发吗?晕啊晕


没记错的话  只要是post 就是 postback.
[/Quote]
我又写代码测试了下:
html页面

<body>
<form id="manageSearchForm" action="" method="post">
<table>
<tr>
<td>
<input id="txtPass0" name="txtPass" type="radio" value="0" /><label for="txtPass0">待审核信息</label>
<input id="txtPass1" name="txtPass" type="radio" value="1" /><label for="txtPass1">未通过审核</label>
<input id="txtPass2" name="txtPass" type="radio" value="2" /><label for="txtPass2">已通过审核上网信息</label>
</td>
<td>
<select id="sltVip" name="sltVip">
<option value="-1">-=VIP不限=-</option>
<option value="1">VIP会员</option>
<option value="0">非VIP会员</option>
</select>
</td>
<td style="background-color: #CCCCCC;">
请输入公司名称或会员ID号或产品名<input id="txtCName" name="txtCName" type="text" value="" />
</td>
<td>
<input id="Button1" type="submit" value="筛选" />
</td>
</tr>
</table>
</form>
</body>


cs页面

protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Request.Form["txtPass"] + Request.Form["sltVip"] + Request.Form["txtCName"]+IsPostBack);
}


然后运行,第一次打开页面只输出False
然后我选择条件之后,点筛选,输出10测试False,也就是说还不是回传。

不是说只要post就是回传?

我真晕了
HenJiong 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xingshungames 的回复:]
引用 1 楼 xray2005 的回复:
简单的理解:在第1次打开页面时,这个是第1次请求.之后,除了JS客户端操作外,其他的服务器控件操作都算是回发.


这个我知道,但是现在很少用服务器控件,大都是用的html控件,然后通过form,post方式传送到本页面,然后后台获取,进行操作的。这算是回发吗?晕啊晕
[/Quote]

没记错的话 只要是post 就是 postback.
xingshungames 2010-01-30
  • 打赏
  • 举报
回复
两大高手捧场,十分感谢啊!

有看周公的《asp.net夜话》,相当不错

62,046

社区成员

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

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

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

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