回发和回调之间的区别

Bis*_*ath 114 javascript asp.net postback callback

我不断听到这句话" 回调 "和" 回发 "左右颠簸.
两个有什么区别?

回发是非常特定的ASP.NET页面?

And*_*ech 201

当页面上的数据(整个页面)从客户端发布到服务器时发生回发.. 数据被发布回服务器,因此页面被刷新(重绘)...想一想作为' 发送服务器整个页面(asp.net)充满数据 '.

另一方面,回调也是一种特殊的回发,但它只是一个快速的往返服务器来获取一小组数据(通常),因此页面不刷新,不像回发......把它想象成" 调用服务器,然后收回一些数据 ".

使用Asp.Net时,调用回调时不会刷新ViewState,这与回发不同.

使用ASP.Net发布整个页面的原因是因为ASP.Net <form>post方法将整个页面封装在一起,所以当在页面中单击提交按钮时,表单将被发送到服务器全部形式中的字段......基本上是整个页面本身.

如果您使用的是FireBug(适用于Firefox),您实际上可以看到调用服务器中的回调Console.这样,您将看到正在向服务器()发送的具体数据Request以及服务器发送给您的数据(Response).


下图说明了基于ASP.NET的网站中的回发和回调的页面生命周期:

ASP.NET页面生命周期
(来源:esri.com)

  • 实际上,回调是一个更通用的编程术语,用于需要在另一个函数完成后执行的函数. (16认同)

San*_*ket 18

当从客户端向服务器发送与用户当前正在查看的页面相同的页面的请求时,会发生回发.发生回发时,将刷新整个页面,您可以在浏览器底部的进度条上看到典型的进度.

当客户端向未刷新页面的服


Sto*_*ely 6

很多讨论是 ASP.NET gobbledygook 语言....

答案是肯定的。回发是 Microsoft 的 ASP.NET 特有的“术语”,但请记住,像 Microsoft 这样的供应商将这些进程的自己版本包装在他们自己的实现中,这让我们所有人都对 Http/Html 世界中真正发生的事情感到困惑。

他们的 POSTBACK 版本基本上是发送回原始服务器的传统 HTTP POST 请求。但是在 ASP.NET 中,他们通过在整个网页周围粘贴一个巨大的 FORM HTML 元素标记(带有 POST 方法属性)而不是在网页的一小部分中粘贴传统的表单控件来实现。他们这样做是因为他们使用 HTTP 规范来维护页面及其控件的“状态”,并确保整个页面,甚至是传统的非表单字段标记,都完好无损地返回。

不幸的是,这会通过网络发送大量不必要的数据,以至于他们的 VIEWSTATE 和它在页面中的姊妹 POSTBACK 已经被许多人视为浪费带宽和实现网页状态的草率方式。我可以向您展示,大多数现代浏览器和网站,如果使用可缓存的 CSS 和一致的 HTML 标记设计,将使用浏览器本机 HTML 缓存非常自然地返回页面状态。即 Full POSTBACK 通常是不必要的。

回调只是 JavaScript。它只是 ECMASCRIPT 马戏团技巧,ASP.NET 将他们称为 AJAX API 的内容存储在浏览器从服务器下载的巨大 JavaScript 库中,并且 ASP.NET 开发人员在不知不觉中打包到他们的网页中以触发网页中的更改,而无需完整的 POSTBACK。用于 AJAX 的 ASP.NET API 只是创建了所有这些位于客户端的大量 Javascript,当用户更改某些内容、滚动某些内容或单击浏览器中的某些内容触发传统 JavaScript 浏览器 DOM 事件时,这些 JavaScript 会在浏览器中触发然后将大量 JSON 或其他数据发送回服务器进行处理。然后由浏览器内存中的 Javascipted 库和对象返回并接受,并更改用户网页和标记的部分内容。

它说大约 5-10% 的用户和浏览器禁用了 Javascript,因此所有这些 JSON 和 AJAX 都会为这些人崩溃和烧毁。即回调将不起作用。

这就是幕后发生的事情。如果你问我,其中大部分是矫枉过正的。这就是过去 ASP.NET 中的 Web 控制模型受到批评的原因。

如果您暂时放弃 ASP.NET,您可以自己在 HTML 网页中使用单个文本框和按钮编写一个简单的 FORM 字段,然后按下它并观看它发布到服务器,就像 ASP.NET 页面所做的那样更快更简单。这才是真正的POSTBACK。浏览器自然会向服务器发送必要的 POST HTTP 标头来执行此操作,但会将 HTML 缓存在页面的其余部分中,因此它自己可以快速呈现。

对于 CALLBACK,您只需将简单的 Javascript/ECMAScript 代码添加到同一个 HTML 页面,其中,当用户在某些文本或按钮上滚动、单击或更改表单字段时,网页不会 POST,但在幕后您让 Javascript 向服务器发送一些东西。你如何通过你自己的 JavaScript、JSON 或库来处理它是另一回事。但它不是魔法。对于没有禁用 Javascipt 或 Javascript 的人,您应该设计没有 CALLBACK 的页面,并且只缓存在单击表单字段控件或超链接时返回的任何更改。这是重新考虑回调例程的一个原因,尽管现在大多数现代用户代理都是为 ECMAScripted 网站例程设置的。

这就是让人们困惑的地方......这些非常基本的 HTTP 请求和 Javascripted 技巧的供应商实现被分层到不清楚的语言中。然后它会导致人们构建可怕的 Web 应用程序,这些应用程序执行所有这些非常简单的编码就可以解决的不必要的事情。

我仍然使用并推荐 ASP.NET。它已经走了很长一段路,而且是一个很棒的系统。但是,如果更多的人在使用它们之前了解他们所做工作的基础知识将会有所帮助,因为如果您看到幕后真正发生的事情,可以对这些框架进行相当多的定制和简化以改进它们。


Kev*_*nle 5

我同意Dreas的回答,但我想补充几点.回发是一个术语,最近由ASP .NET编程引入,正如Dreas所解释的那样,而回调更通用,并且在Web开发存在之前就已经被使用了.事实上,当我开始用C语言编程时,我第一次听说回调(可能是之前存在的术语,我不知道),它只是指向函数的指针和指向函数的指针(名称为A)传递给另一个函数(名称为B),稍后将调用A.回调最近也被Yahoo UI Connection Manager和其他Ajax框架使用,但我相信该术语在旧的C日中首次使用.