2

在我开始之前,我已经看到了这个关于一个非常相似的主题的问题(以及这个这个),没有一个完全回答了我的问题。我已经了解这些问题/答案中提出的概念,但我还有更多问题。

A)如果您有多个控件,AutoPostBack="false"并且在回发之前更改了其中的一些,会发生什么情况?以下面的简短示例为例(假设页面所需的所有其他内容都正确且简单地编写;例如,Page_Load):

默认.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"

默认.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) { }

现在,假设您更改ddlFoo3,然后更改ddlBarb。然后,您单击btnQuxResponse.Write单击后,您将获得以下输出:

ddlBar changed to b. ddlFoo changed to 3. 

为什么会这样?一旦回发发生,这些OnSelectedIndexChanged方法是否会被放入堆栈中以调用?

B)AutoPostBack="false"为什么当我使用这种方法并为我的大多数控件设置时,我的网页加载速度更快?具体来说,我对 a CheckBox、 aDropDownList和 a TextBoxin a 执行了此操作GridView,它检索了大约 1200 行和 27 列数据,并且在 VS2008 调试模式下花费了 10 秒,而之前是 310 秒。为什么加载/刷新时间会这么快?

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

4

4 回答 4

7

警告:我不是 ASP.NET 专家...如果这被证明是垃圾,我会删除它 :)

A)我相信您会看到所有控件的新值,无论何时回发最终发生,包括所有更改事件,正如您所描述的那样。毕竟,这些值已经改变了——AutoPostBack只是影响了时间(当然还有回发是否发生)。

B) 在所有控件上提供的 HTML 中有更多的 Javascript AutoPostBack = True,但不足以产生巨大的差异。正如您在编辑中指出的那样,无论如何,这似乎是一个暂时性问题 - 如果没有更多诊断,我们无法真正解释暂时性问题。

于 2013-07-31T19:09:40.100 回答
2

您可以使用Fiddler查看客户端和服务器之间正在移动的数据。

A.使用 fiddler,您可以轻松查看发送到服务器的数据。

例如:

如果你有 DropDownList ddlFoo,当你点击按钮时,你实际上发布了这个信息:

POST http:// [server]:[port]/[resource.aspx] HTTP/1.1 Host: [server]:[port] [Headers...]

_ VIEWSTATE[作为隐藏字段值存储在 html 中的视图状态数据]& _EVENTVALIDATION=[事件验证数据]&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 函数,该函数将自动回发到服务器。

于 2013-07-31T19:18:43.967 回答
1

到目前为止,您得到的两个答案都是正确的。它的简化版本是这样的:

A) 当表单最终发布到服务器时,服务器将表单的当前状态与 ViewState 进行比较并做出相应的响应。

B) 启用 AutoPostBack 会导致生成 javascript,并且此 javascript 提交表单(然后触发回发)。

于 2013-07-31T19:31:15.737 回答
1

为什么会这样?OnSelectedIndexChanged 方法是否被放入堆栈中以在回发发生后调用?

不会立即回发的事件(在您的情况下为 ddlFoo_Changed 和 ddlBar_Changed)被缓存

然后,当页面被回发时(通过 btnQux 的点击事件),这些缓存/未决事件与 btnQux 的点击事件一起引发。

您可以在此处阅读更多内容 - ASP.NET 服务器控制事件模型

于 2013-07-31T20:18:50.070 回答