什么是回发?

时间:2010-11-22 23:10:37

标签: asp.net

我发现postBack的最佳解释来自Wiki.

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

虽然本文确实解释了如何在ASP中使用第二页,但在ASP.NET中不再需要,但它没有提供太多细节或背景知识。我正在寻找关于PostBacks的信息。就像900 page book这个简单的问题“我怎样才能打扫房子”一样。我不需要900页,但请详细说明。我找到了一个很好的ASP.NET生命周期的小教程,但它严重掩盖了回发(除此之外)。

我期待那些在.NET之前出现过的开发人员并且真的不认为这些事情是理所当然的。书籍和超链接是您答案的合理答案或补充。

10 个答案:

答案 0 :(得分:60)

到目前为止,我已经看到正确的答案反复提到,几乎每个人都对我认为主观上的标记感到害羞。

让我们从基础知识开始:

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

现在你会说(我敢肯定)GET请求中的URL经常包含数据,这是正确的,但根据W3C,你不应该使用GET来改变状态,但我们经常这样做。这是一种我们都同意的黑客是实际使用,而不是黑客攻击。无论是使它成为黑客还是实际的实施细节,我都会留给您。

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

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

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

所以这是另外需要考虑的事情:

如果您为用户提供了一堆包含<input> s且没有<form>的页面,但是在javascript中连接了一个按钮以将所有<input>与{ {1}}并将其作为GET发送?做同样的事情,但违反了仅对请求使用GET的概念。 (可能) 随后的讨论鼓励我强调GET应该没有副作用(没有更新值)

例如,你可以向某人发送链接到谷歌搜索。所以我们不必总是回到服务器来获取数据。

希望这会有所帮助。 干杯

答案 1 :(得分:28)

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

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

答案 2 :(得分:28)

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

请参阅 ASP.NET MVC

答案 3 :(得分:13)

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

这使您可以使用页面浏览服务器上的asp引擎以及要更新的任何动态内容。

here is a nice explanation

答案 4 :(得分:10)

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

如果用户遇到错误,这很有用。 asp.net viewstate自动为您完成此操作,而不是程序员必须处理记住重新填充每个Web控件。它也很有用,因为现在后面的代码可以使用intellisense访问asp.net Web表单上这些控件的值。

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

答案 5 :(得分:8)

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

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

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

答案 6 :(得分:4)

在旧的HTML中,在网页上更新内容的唯一方法是将新网页重新发送到客户端浏览器。这就是ASP曾经做过的事情,你必须做这个事情,称之为“PostBack”,将更新后的页面发送给客户端。

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

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

答案 7 :(得分:3)

只需用一点代码就可以了。希望它对你有所帮助。 当您首先请求页面网址时。你可以在大多数浏览器中查看它的源代码。以下是它的一个例子。

Post Post的基本功能实际上是调用__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>

答案 8 :(得分:2)

回发是一个请求,在此期间ASP从视图状态恢复控件属性的值。

答案 9 :(得分:1)

IsPostBackAsp.Net页面的一个属性,用于说明该网页是否为on its initial load,以及用户是否在您的网页上执行了导致该网页的按钮发回自己。

更多关于... Asp.Net ispostback()