AutoPostBack: true vs false
本文关键字:false vs true AutoPostBack | 更新日期: 2023-09-27 18:25:38
在开始之前,我已经看过关于一个非常相似的主题的这个问题(以及这个和这个),没有一个完全回答我的问题。我已经理解了这些问题/答案中提出的概念,但我还有更多的问题。
A) 如果使用AutoPostBack="false"
有多个控件,并且在回发之前更改了其中的一些控件,会发生什么情况?举以下简短的例子(假设页面所需的所有其他内容都写得正确而琐碎;例如Page_Load
):
Default.aspx:
<asp:DropDownList ID="ddlFoo" runat="server"
OnSelectedIndexChanged="ddlFoo_Changed" AutoPostBack="false" >
<asp:ListItem Text="a" />
<asp:ListItem Text="b" />
<asp:ListItem Text="c" />
</asp:DropDownList>
<asp:DropDownList ID="ddlBar" runat="server"
OnSelectedIndexChanged="ddlBar_Changed" AutoPostBack="false" >
<asp:ListItem Text="1" />
<asp:ListItem Text="2" />
<asp:ListItem Text="3" />
</asp:DropDownList>
<asp:Button ID="btnQux" runat="sever" Text="Click for PostBack" OnClick="btnQux_Click"
Default.aspx。cs:
protected void ddlFoo_Changed(object sender, EventArgs e)
{
Response.Write("ddlFoo changed to " + ddlFoo.Text + ". ");
}
protected void ddlBar_Changed(object sender, EventArgs e)
{
Response.Write("ddlBar changed to " + ddlBar.Text + ". ");
}
protected void btnQux_Changed(object sender, EventArgs e) { }
现在,假设您将ddlFoo
更改为3
,然后将ddlBar
更改为b
。然后,单击btnQux
。点击后,您将从Response.Write
获得以下输出:
ddlBar changed to b. ddlFoo changed to 3.
为什么会发生这种情况?OnSelectedIndexChanged
方法是否被放入堆栈中,以便在发生回发时调用?
B) 当我使用这种方法并为大多数控件设置AutoPostBack="false"
时,为什么我的网页加载得更快?具体来说,我为GridView
中的
CheckBox
、DropDownList
和TextBox
执行了此操作,它检索了约1200行27列的数据,在VS2008调试模式下花费了10秒,而之前为310秒。为什么加载/刷新时间会快得多?
编辑:我今天下午早些时候发布了代码,旧版本(AutoPostBack="true"
)和新版本(AutoPostBack="false"
)的加载时间没有显著差异。我认为调试器可能做了一些额外的事情,这导致了加载时间的大幅跳跃。一个更好的方法来重新表述问题b)可能是这样的:调试器可能一直在做什么来导致加载时间的大幅跳跃?
警告:我不是ASP.NET专家。。。如果这是垃圾,我会删除它:)
A) 我相信,无论何时回发结束,您都会看到所有控件的新值,包括所有更改事件,正如您所描述的那样。毕竟,这些值已经改变了——AutoPostBack
只会影响时间(当然,也会影响回发是否发生)。
B) 在所有控件上使用AutoPostBack = True
提供的HTML中有更多的Javascript,但还不足以产生巨大的差异。正如您在编辑中所指出的,无论如何,这看起来都是一个瞬态问题——如果没有更多的诊断,我们就无法真正解释瞬态问题。
您可以使用Fiddler查看客户端和服务器之间移动的数据。
A使用fiddler,您可以很容易地看到哪些数据被发送到服务器。
例如:
如果你有DropDownListddlFoo,当你点击按钮时,你实际上发布了以下信息:
POST http://[server]:[port]/[resource.aspx]http/1.1主机:[server]:[port][标题…]
_VIEWSTATE[VIEWSTATE数据存储在html中作为隐藏字段值]&_EVENTVALIDATION=[事件有效期数据]&ddlFoo=选择项目&button1=按钮文本
当ASP.NET接收到请求时,它会比较ddlFoo的值并调用它的事件。
B当您将AutoPostBack设置为true时,将生成以下javascript函数:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
并且onchange属性将添加到ddlFoo中。因此,每当您更改DropdownList项时,就会触发onchange事件,并调用__doPostBack函数,该函数将自动发布回服务器。
到目前为止,您得到的两个答案都是正确的。它的简化版本是:
A) 当表单最终被张贴到服务器时,服务器将表单的当前状态与ViewState进行比较并做出相应的响应。
B) 启用AutoPostBack会生成javascript,此javascript会提交表单(然后触发回发)。
为什么会发生这种情况?OnSelectedIndexChanged方法是否被放入返回到堆栈中以便在发生回发时调用?
没有立即返回的事件(在您的情况下是ddlFoo_Changed和ddlBar_Changed)被缓存。
然后,当页面(通过btnQux的点击事件)被发布回时,这些缓存/挂起的事件将与btnQux的点击事件一起引发。
您可以在此处阅读更多信息-ASP.NET服务器控制事件模型