AutoPostBack:true与false

时间:2013-07-31 19:06:38

标签: c# asp.net autopostback

在开始之前,我已经看过this question about a very similar topic(以及this onethis 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中的DropDownListTextBoxGridView执行了此操作,检索了大约1200行和27列数据并花了10秒在VS2008调试模式与310s之前。为什么加载/刷新时间会快得多?

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

4 个答案:

答案 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