ASP.net无法从事件处理程序更新页面

时间:2009-03-09 13:51:36

标签: asp.net events

我在页面上有一个链接按钮,该按钮的click事件的事件处理程序调用一个对象的方法,该对象反过来调用webservice,当webservice返回对象时触发一个事件和一个事件处理程序页面上的codebehind更新页面上的标签。由于某种原因,标签不显示消息。

这让我疯狂,我在谷歌上找不到任何关于它的东西。任何帮助都会得到满足。

正在异步调用Web服务,但线程被阻塞直到它返回。并且在代理对象事件处理程序设置其文本之后调用标签预渲染事件。

所有调用都发生在同一个线程上,我在事件处理程序中设置的任何值,而不仅仅是标签文本,都会在预渲染事件触发时恢复到之前的值。

3 个答案:

答案 0 :(得分:3)

以下是发生的事情:

  • 用户点击您的链接按钮
  • 浏览器向网络服务器发送回发请求
  • Web服务器创建页面类的全新实例并启动新的页面生命周期
  • 页面生命周期完成所有正常的加载工作。
  • 页面生命周期到达事件处理阶段并运行您的点击事件
  • click事件通过您描述的“代理”对象
  • 调用Web服务
  • 代理对象异步调用Web服务并返回
  • 点击事件返回,因为它没有别的办法,可以释放ASP.Net继续浏览页面生命周期。
  • 页面生命周期结束,因此页面将呈现给浏览器
  • 用户看到新页面,但标签是相同的,因为Web服务调用尚未完成
  • Web服务调用返回到您的代理对象,这会引发其已完成的事件
  • 您的事件处理程序更新已呈现的页面类中的标签文本属性
  • 此请求中的页面实例已被处理。

<强>更新
OP发布后更新了他的问题,表明生命周期时间保持同步。所以相反,我会指出ASP.Net中的控件不是线程安全的,但是从后台使用的线程调用webservice completed事件来生成异步请求而不是原始线程。设置属性时,您应该Invoke控件。

答案 1 :(得分:0)

你在Page_Load活动中有这个吗?

if (Page.IsPostBack)
{
   return;
}

如果没有,可以在回发后重新初始化标签。

答案 2 :(得分:0)

Web服务是否异步运行?在页面呈现后,webservice完成事件可能会触发吗?您是否进行了调试以确保标签值已设置?