在开始之前,我已经看过this question about a very similar topic(以及this one和this one),但没有一个完全回答我的问题。我已经理解了这些问题/答案中提出的概念,但我还有更多问题。
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"
?具体来说,我为
CheckBox
中的DropDownList
,TextBox
和GridView
执行了此操作,检索了大约1200行和27列数据并花了10秒在VS2008调试模式与310s之前。为什么加载/刷新时间会快得多?
编辑:我今天早些时候发布了代码,旧版(AutoPostBack="true"
)和新版本(AutoPostBack="false"
)的加载时间没有显着差异。我认为也许调试器正在做一些额外的事情,这导致了加载时间的大幅增加。一个更好的方法来改写问题 B)可能是这样的:调试器一直在做什么来导致加载时间的这么大的跳跃?
答案 0 :(得分:7)
警告:我不是ASP.NET专家......如果这是垃圾,我会删除它:)
A)我相信,无论何时回发结束,您都会看到所有控件的新值,包括所有更改事件,就像您所描述的那样。毕竟,值已经改变 - AutoPostBack
只会影响时间(当然,回发是否完全发生)。
B)在所有控件上使用AutoPostBack = True
提供的HTML中有更多Javascript,但还不足以产生巨大差异。正如您的编辑中所指出的那样,看起来这仍然是一个短暂的问题 - 如果没有更多的诊断,我们无法真正解释瞬态问题。
答案 1 :(得分:2)
您可以使用Fiddler查看客户端和服务器之间正在传输的数据。
A。使用fiddler,您可以轻松查看向服务器发送的数据。
例如:
如果你有DropDownList ddlFoo ,当你点击按钮时,你实际上发布了这个信息:
POST http:// [server]:[port] / [resource.aspx] HTTP / 1.1主机:[server]:[port] [集管...]
_ VIEWSTATE [查看存储在html中的数据作为隐藏字段值]&amp; _EVENTVALIDATION = [event validaion 数据]安培; ddlFoo = selecteItem&安培; button1的= ButtonText
当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函数,该函数将自动回发到服务器。
答案 2 :(得分:1)
到目前为止,你得到的答案都是正确的。它的简化版本是:
A)当表单最终POST到服务器时,服务器将表单的当前状态与ViewState进行比较,并做出相应的响应。
B)启用AutoPostBack会导致生成javascript,并且此javascript会提交表单(然后会触发回发)。
答案 3 :(得分:1)
为什么会这样?是否放置OnSelectedIndexChanged方法 一旦发生回发就被调用到堆栈中?
不立即回发的事件(在您的情况下为ddlFoo_Changed和ddlBar_Changed)是 缓存 。
然后,当页面被回发(通过btnQux的点击事件)时,这些缓存/待处理事件与btnQux的click事件一起被引发。
您可以在此处阅读更多内容 - ASP.NET Server Control Event Model