我可能误解了AJAX是如何工作的 - 有人可以对以下简化方案有所了解:
我有一个asp.net Web应用程序。在页面上,更新面板中没有用户控件(没有更改属性)和脚本管理器。
在用户控件和表单上有一个标签,两者都在load事件中将其文本设置为DateTime.Now.ToString
。还有一个按钮,可以在用户控件中返回帖子。
当我点击按钮时,我希望用户控件内的标签更新,页面上的一个标签现在就可以了。到目前为止一切都很好。
然而......页面上的页面加载事件会被isPostBack = True处理(我没想到),看起来加载事件中发生的任何事情都没有得到推回客户端(因为标签没有更新)。
我没想到在更新AJAX面板时会引发和处理页面加载事件(在包含用户控件的页面中),这是正确的吗?或者我做错了什么?我记得读过一些关于Page.IsCallback的内容,但这是假的,所以也许这与此无关。
答案 0 :(得分:4)
嗯,这个问题不是关于AJAX本身,而是关于微软基于AJAX的UpdatePanel,这是一个复杂的野兽。 UpdatePanel工作方式的简单解释是,一切都与普通的整页“回发”相同(ViewState发布到服务器,重新创建服务器端DOM,执行所有页面事件生命周期事件)除了在最后,呈现给客户端的响应仅包括刷新启动AJAX请求的UpdatePanel内容所需的HTML子集。还有一些额外的细微之处和复杂性,但这是基本的想法。
答案 1 :(得分:2)
即使部分回发也会执行所有页面生命周期事件。您可以通过执行以下操作来区分完整回发和部分回发:
if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
{
}
答案 2 :(得分:1)
如果没有看到你正在做的事情的一些样本,我认为你可能会说你做错了错误。
但是,是的,更新面板仍会调用服务器端的大部分页面生命周期。 如果您正在寻找的是避免页面生命周期,页面方法可能更符合您的口味。他们确实需要使用javascript来解决问题。
答案 3 :(得分:0)
在PostBack期间,所有页面生命周期事件再次执行,页面将重新创建并重新发送给客户端。
UpdatePanel本质上执行完整回发,但只更新客户端中的更新面板内的控件。因此,即使您可能更改服务器上的值,更新面板外的任何控件都不会更新。
您可以使用Page.IsPostBack
属性来检查您是在进行页面的初始加载还是回发。例如,只在第一次加载页面时执行某些操作:
if (!Page.IsPostBack)
{
//doSomething
}