什么是Postback?

86

我找到的关于PostBack最好的解释来自于维基百科

PostBack是指对表单进行HTTP POST请求并返回相同页面的过程。

虽然该文章确实解释了在ASP中需要第二个页面,但在ASP.NET中不再需要的原因,但它并没有给出很多细节或背景信息。我正在寻找有关PostBack的详尽信息。就像“我怎样可以打扫房子”这样简单的问题可以通过这本900页的书来回答。我不需要900页,但请提供详细信息。我找到了一个很好的ASP.NET生命周期教程,但它严重忽略了PostBack(以及其他一些东西)。

我希望得到那些在.NET之前就已经存在并且不会忽视这些事情的开发人员的帮助。书籍和超链接都是合理的答案或添加到您的答案中的内容。


与.NET相关的最正确答案-> https://dev59.com/fXVC5IYBdhLWcg3wykaj - Don Cheadle
对于经典的ASP服务器端函数,这可能会有所帮助:https://dev59.com/i3I95IYBdhLWcg3w2Rvz#58054341 - tb-mtg
这个经典的ASP服务器端函数可能会有所帮助:https://dev59.com/i3I95IYBdhLWcg3w2Rvz#58054341 - tb-mtg
9个回答

62

到目前为止,我看到有许多人都对正确答案有所暗示,但几乎每个人都未能达到我主观认为的标准。

让我们从基础知识开始:

HTTP请求可以是任何 HTTP动词,但大多数人使用的是GET和POST。好吧,程序员最常用的两种。其他所有动词如果在服务器上实现都有一定的用途。当您向服务器发送信息时,可以通过URL(请求页面)或请求主体内(例如POST,PUT,DELETE)发送信息。

现在你可能会注意到,在GET请求中URL通常包含数据,这是真的,但根据W3C的规定,您不应该使用GET来更改状态,但我们经常这样做。这是我们都同意的一种hack,既不是hack也是实际用途。它是hack还是实际实现细节取决于您。

因此,当您将表单元素与POST请求一起发送(现在跳过其他请求,您可以从这里弄清楚),您将返回某些元素。如何定义这些元素取决于您和您工作的环境。您可以使用JSON元素、XML或表单字段将其发布到服务器。通常情况下,我们会通过HTML的body中的FORM元素进行发布。

现在大家都说,“哦,Postback是对页面的后续请求。”但是,这并不正确。Postback是当您通过POST将数据发送回服务器时发生的。我之所以这么说,是因为GET请求和POST请求之间的区别在于是否包含在正文中的数据(以及使用的动词,但客户端通常知道如何处理它)。您可以在第一次访问页面时进行Postback,并且实际上ASP.NET库中有用于此的工具。您肯定可以让桌面客户端向服务器发送POST数据(例如Twitter)而不显示来自服务器的任何网页(好吧,Twitter可能不是这里要使用的最佳概念,但我想说明您可以使用不显示网页的客户端,因此不需要请求)。
因此,您应该在“postback”中阅读的内容是“我正在将数据通过POST发送回服务器进行处理”。假设您最初使用GET检索页面,以显示用户与之交互的字段的
元素,并且最终您将发送数据回来。但我希望您能看到它不一定按照这个顺序进行。
因此,请考虑以下内容:
如果您提供了一个带有一堆但没有的页面给用户,而是用javascript连接所有这些&value-n=连接到GET发送的按钮?做同样的事情,但违反了仅使用GET进行请求的概念。这就是为什么您可以向某人发送一个Google搜索链接的原因,例如。因此,我们不必总是POST回服务器获取数据。
希望这有所帮助。

1
同样的事情,但违反了只使用GET请求的概念。(可能)这是毫无疑问的。GET请求不应该产生副作用。它们只应该请求数据(因此得名GET)。 - George Marian
34
问题标记为ASP.NET。 在ASP.NET中,“Postback”一词具有特定的含义,涉及页面生命周期事件、Viewstate、测试IsPostBack等。 - Ian Mercer
2
那么基本上,postback只是向任何页面发送HTTP POST请求? - Koray Tugay
虽然这些都是真实的,但我认为我必须同意这个答案需要一些认识/承认ASP.Net如何处理POST Backs及其在该平台内的特殊含义。无论我们是否喜欢或同意M$喜欢玩快速和松散的标准,现实是他们已经这样做了,他们正在这样做,并且了解特定平台的工作方式对于在其中工作的人非常重要。希望未来的读者会寻找缺失的部分和碎片。 - DavidScherer
嗨@DavidScherer,这是一个维基网站。请随意添加澄清并改善所有人的生活。 - jcolebrand
显示剩余3条评论

28

请参考微软官方文档中的ASP.NET页面生命周期概述,了解当请求到达服务器时会发生什么。

PostBack是指任何不是首次请求页面的请求。PostBack始终是对用户操作的响应(最常见的是由按钮、AutoPostBack控件或Ajax触发)。


1
尽管这是一个老话题,我想指出你的答案部分不正确(以免误导其他人)。您可以将表单操作指向任何URL,因为它可能是第一个请求。重要的是它是POST。 - Michael Goss

27

POSTBACK: ASP.NET中虚构的技术之一,用于隐藏Web / HTTP真实无状态的本质,以统一有状态的外观。这导致了复杂的代码(IsPostback,...),难以理解的页面生命周期,许多不同的事件,以及众多问题(ViewState大小,Web农场黏性,状态服务器,浏览器警告(不使用PRG模式),...)

请参考ASP.NET MVC。


3
哇,真的吗?我相当确定我听过“postback”这个词在除了asp.net以外的其他框架中被使用...让我们不要让那个可怜的家伙感到困惑。 - jcolebrand
3
这个问题标记为ASP.NET。在ASP.NET的上下文中,“Postback”有一个特定的含义。例如,请参见:http://msdn.microsoft.com/zh-cn/library/system.web.ui.page.ispostback.aspx - Ian Mercer
在 ASP.NET 的上下文之外,提交表单仍然是一种有效的操作。 - jcolebrand
如果你真的想避免让 OP 感到困惑,那么你应该明确指出该术语还有其他可行的定义。 - George Marian
4
作为一名长期非微软网络开发人员,我从未在.NET以外的语境中听说过“PostBack”的术语。提交数据和PostBack这个术语是非常不同的事情。这是一个完美的答案。 - tommybananas
@jcolebrand 是的,但这是一个ASP.Net问题。如果不至少提到在ASP.net中它们的特殊性质,解释postback将会很困惑。 - DavidScherer

13

Post back是从客户端(浏览器)到服务器再返回客户端的来回旅程。

这使得您的页面可以通过服务器上的asp引擎并更新任何动态内容。

这里有一个不错的解释


10

ASP.Net使用一个新的概念(与asp相比,它已经过时了)- ViewState来维护你的asp.net控件的状态。这意味着什么?简而言之,如果您在文本框中输入一些内容或从下拉列表中选择一个选项,当您单击按钮时,ViewState将记住这些值。旧的asp需要您编写代码来记住这些值。

当用户遇到错误时,这非常有用。现在asp.net viewstate会自动为您重新填充每个web控件,程序员无需处理记住这些值的问题。这也很有用,因为现在后端代码可以通过智能提示访问这些控件的值,以及在asp.net web表单上的其他控件。

至于发布到同一页,是的,“提交”按钮将发布到页面代码后面的事件处理程序。如果需要的话,由事件处理程序在后端代码中重定向到不同的页面(或者在您的页面上提供错误消息或其他任何您可能需要做的操作)。


8

维基百科对postback的定义很好,但我想添加以下内容:postback是对与表单在同一页面上的后续HTTP POST请求。

如果我有一个带有表单的页面,而不是让提交按钮将浏览器重定向到另一个处理表单的页面,而是让提交按钮刷新当前页面(并执行一些特定的验证/保存页面的步骤),那么该提交按钮就被称为postback到了当前页面。

Postbacks可以是完全的(刷新整个页面)或部分的(在使用AJAX的情况下)。 部分页面postback只会重新呈现页面的一部分(如单个下拉列表、表格等)。


4
在旧版HTML中,更新网页上的内容唯一的方法是重新向客户端浏览器发送一个新的网页。这就是ASP以前所做的事情,你必须进行"PostBack"来向客户端发送更新后的页面。
在ASP.NET中,你不必重新发送整个网页。现在你可以使用AJAX或其他ASP.NET控件,这样你就不必重新发送整个网页。
如果你访问一些旧网站,你会注意到一旦你点击某个东西,整个页面都要刷新,这就是旧的ASP。在大多数现代网站中,你会注意到你的浏览器不必刷新整个页面,它只更新需要更新的部分内容。例如,在Stackoverflow中,你只看到页面更新了内容,而不是整个网页。

这有一定的道理,但可能有点误导。标准的asp.net Postbacks确实会将整个页面以及视图状态发送回服务器并刷新整个页面。AJAX通过只能够提交页面的部分内容使这个过程变得更加美好。 - Scottie

3

简单来说,只需要加入少量的代码即可实现。希望对你有所帮助。 当你首次请求页面的URL时,大多数浏览器都可以查看其源代码。以下是一个示例。

PostBack的本质是调用__doPostBack,将从您首次请求的所有表单数据提交回服务器。(__EVENTTARGET包含控件的ID。)

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
    NHibernate Demo
</title>
    <script language="javascript" type="text/javascript">
        function dopost() {
                __doPostBack('LinkButton1', '');    
        }
    </script>
</head>
<body>
    <h1>NHibernate Demo</h1>    
    <form name="ctl01" method="post" action="Default.aspx" id="ctl01">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTMxNzcwNTYyMWRkKHoXAC3dty39nROvcj1ZHqZ5FYY=" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['ctl01'];
if (!theForm) {
    theForm = document.ctl01;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>   
<div>
    <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="B2D7F301" />
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKZx5vTCgKM54rGBgLM9PumD20dn9KQguomfpAOdTG0r9Psa7al" />
</div>
        <a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>
        <input type="button" value="testPostBack" id="testpostback" onclick="dopost();" />
    </form>
</body>
</html>

2

Postback是ASP中的一种请求,它从视图状态中恢复控件属性的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接