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中的 CheckBoxDropDownListTextBox执行了此操作,它检索了约1200行27列的数据,在VS2008调试模式下花费了10秒,而之前为310秒。为什么加载/刷新时间会快得多?

编辑:我今天下午早些时候发布了代码,旧版本(AutoPostBack="true")和新版本(AutoPostBack="false")的加载时间没有显著差异。我认为调试器可能做了一些额外的事情,这导致了加载时间的大幅跳跃。一个更好的方法来重新表述问题b)可能是这样的:调试器可能一直在做什么来导致加载时间的大幅跳跃?

AutoPostBack: true vs false

警告:我不是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服务器控制事件模型