【问题标题】:What is a postback?什么是回发?
【发布时间】:2025-11-26 14:15:02
【问题描述】:

我找到的关于 postBack 的最佳解释来自 Wiki.

回发是对表单所在页面的 HTTP POST。

虽然文章确实解释了在 ASP 中如何需要第二页,但在 ASP.NET 中不再需要,但它没有提供太多细节或背景。我正在寻找关于 PostBacks 的大量信息。就像“我如何打扫房子”这个简单的问题一样,900 page book 可以解决这个问题。我不需要 900 页的价值,但请提供详细信息。我找到了一个关于 ASP.NET 生命周期的不错的小教程,但它严重掩盖了回发(以及其他内容)。

我正在寻找那些在 .NET 之前就已经存在的开发人员,他们真的不认为这些事情是理所当然的。书籍和超链接是您的答案的合理答案或补充。

【问题讨论】:

标签: asp.net


【解决方案1】:

到目前为止,我已经看到反复提到的正确答案,几乎每个人都回避了我主观认为的标记。

让我们从基础开始:

HTTP 请求可以是HTTP verbs 中的任何一个,但人们最常使用的两个是GET 和POST。嗯,这是程序员最常使用的两个。其他的都有一些目的,如果它们在服务器上实现的话。当您向服务器发送信息时,您可以通过使用 URL(请求页面)或在请求正文中(例如 POST、PUT、DELETE)来执行此操作。

现在您会注意到(我确定)GET 请求中的 URL 经常包含数据,这是事实,但根据 W3C,您不应该使用 GET 来更改状态,但我们经常这样做。这是一种我们都同意是实际用途的 hack,而不是 hack。无论是 hack 还是实际的实现细节,我都由你来决定。

因此,当您发送带有表单元素的 POST 正文(暂时跳过其他内容,您可以从这里弄清楚)时,您正在发送回某些元素。如何定义这些元素取决于您和您工作的环境。您可以在正文中使用 JSON 元素、使用 XML 或使用表单字段发布到服务器。通常我们从 HTML body 中的 FORM 元素发布帖子。

现在每个人都说,“哦,回发是对页面的后续请求。”但是,事实并非如此。回发是当您通过 POST -> 将数据发送回服务器时。我这样说是因为 GET 请求和 POST 请求之间的区别在于数据是否包含在正文中(以及使用的动词,但客户端通常知道如何处理)。您可以在第一次访问页面时回发到该页面,事实上 ASP.NET 在库中提供了执行此操作的工具。你当然可以有一个桌面客户端 POST 数据到服务器(想想 Twitter),而不显示来自服务器的任何网页(好吧,所以 twitter 可能不是这里用作示例的最佳概念,但我想说明你可以使用不显示网页的客户端,因此无需请求)。

所以你应该在“回发”中读到的是“我正在将数据回传到服务器进行处理”。假设您最初使用 GET 检索页面以向用户显示具有 <input> 字段供他们交互的 <form> 元素,并且最后您将数据发送回。但我希望你能看到它不必按这个顺序。

所以这里还有一些需要考虑的事情:

如果你给用户一个包含<input>s 而没有<form> 的页面,而是在javascript 中连接一个按钮来连接所有<input>s 和&value-n= 并将它们发送为一个GET?做同样的事情,但违反了仅使用 GET 请求的概念。 (可能) 接下来的讨论鼓励我强调 GET 应该没有副作用(没有更新值)

这就是为什么你可以向某人发送一个谷歌搜索的链接,例如。所以我们不必总是回传到服务器来获取数据。

希望这会有所帮助。 干杯

【讨论】:

  • Does the same thing, but violates that concept of only using GET for requests. (possibly) 不可能。 GET 请求不应该有副作用。他们应该只请求数据(因此名称为 GET)。
  • -1:问题标记为 ASP.NET。在 ASP.NET 中,术语“回发”具有特定含义,涉及页面生命周期事件、视图状态、测试 IsPostBack、...
  • @high M$ 可能会尝试重新定义他们想要的。然而,这并不意味着我们必须接受它。
  • @hightechrider 如果没有我给出的解释,你能解释一下那个循环的各个部分吗?
  • 所以基本上,回发只是对任何页面的 HTTP POST?
【解决方案2】:

请参阅 MSDN 上的 ASP.NET Page Life Cycle Overview,了解有关请求到达服务器时发生的情况的一般性介绍。

回发是对不是第一个请求的页面的任何请求。 PostBack 将始终响应用户操作(最常见的是由 Button、AutoPostBack 控件或 Ajax 触发)。

【讨论】:

  • 尽管这是一个老话题,但我想指出您的答案部分不正确(因此其他人不会误导)。您可以将表单操作指向您希望的任何 URL,因为它可能是第一个请求。重要的是它是一个 POST。
【解决方案3】:

POSTBACK:ASP.NET 设计的技术的一部分,用于将 Web/HTTP 的真正无状态特性隐藏在有状态的外观后面。这会导致复杂的代码(IsPostback,...),难以理解的页面生命周期,许多不同的事件,...以及许多问题(ViewState 大小,网络农场粘性,状态服务器,浏览器警告(不使用 PRG 模式) , ...)

请参阅 ASP.NET MVC

【讨论】:

  • 哇,真的吗?我很确定我听说过在引用除 asp.net 之外的其他框架中使用的回发......我们不要让这个可怜的小伙子感到困惑。
  • 问题标记为 ASP.NET。在 ASP.NET 的上下文中,“回发”具有特定的含义。例如:msdn.microsoft.com/en-us/library/…
  • 并且在 ASP.NET 回发的上下文之外仍然是有效的操作。
  • 如果您真的想避免混淆 OP,您应该明确该术语还有其他工作定义。
  • 作为一名长期非 Microsoft 的 Web 开发人员,我从未听说过 .net 上下文之外的“PostBack”一词。发布数据和术语 PostBack 是非常不同的东西。这是一个完美的答案。
【解决方案4】:

回发是从客户端(浏览器)到服务器然后返回客户端的往返。

这使您的页面能够通过服务器上的 asp 引擎和任何要更新的动态内容。

here is a nice explanation

【讨论】:

    【解决方案5】:

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

    这在用户遇到错误时很有用。程序员不必处理记住重新填充每个 Web 控件,asp.net 视图状态会自动为您执行此操作。它也很有用,因为现在后面的代码可以使用智能感知访问您的 asp.net 网络表单上这些控件的值。

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

    【讨论】:

      【解决方案6】:

      回发的*定义非常好,但我会添加以下内容: 回发是 后续 HTTP POST 到表单所在的同一页面。

      如果我有一个带有表单的页面,而不是让我的提交按钮将浏览器重定向到另一个将处理表单的页面,而是让提交按钮刷新当前页面(并执行一些特定步骤来验证/save 页面,大概),然后该提交按钮被称为已回发到当前页面。

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

      【讨论】:

        【解决方案7】:

        在旧的 HTML 中,在网页上进行更新的唯一方法是将新网页重新发送到客户端浏览器。这就是 ASP 过去做的事情,你必须做这个叫做“PostBack”的事情来向客户端发送更新的页面。

        在 ASP .NET 中,您不必重新发送整个网页。您现在可以使用 AJAX 或其他 ASP.NET 控件,这样您就不必重新发送整个网页。

        如果你访问一些旧网站,你会注意到一旦你点击某个东西,整个页面必须刷新,这是旧的 ASP。在大多数现代网站中,您会注意到您的浏览器不必刷新整个页面,它只会更新需要更新的部分内容。例如,在 * 中,您会看到页面仅更新内容,而不是整个网页。

        【讨论】:

        • 这话有点对,但可能有点误导。标准的 asp.net 回发确实将整个页面以及视图状态发送回服务器并刷新整个页面。 AJAX 确实使这一点变得更好,因为它能够只回发页面的一部分。
        【解决方案8】:

        简单地用一点代码来说明这一点。希望对您有所帮助。 当您第一次请求页面 url 时。您可以在大多数浏览器中查看它的源代码。下面是它的一个示例。

        Post Back 的本质实际上是调用__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>
        

        【讨论】:

          【解决方案9】:

          回发是 ASP 从视图状态恢复控件属性值的请求。

          【讨论】: