如何在使用ASP.NET的事件期间更新UI?

时间:2011-01-17 14:48:14

标签: asp.net asynchronous

我有点陷入困境。我觉得解决方案应该是相当直接的,但出于某种原因,我完全没有想法。

这是问题所在。我有一个带有几个按钮的用户控件。将它们视为“开”和“关”。单击任一按钮时,将调用异步方法。如果方法成功,则触发事件。在这个事件中,我想更新两个按钮的enabled属性,这样一次只能点击一个按钮。问题是我对属性所做的任何更改都不会显示在屏幕上,因为回发已经完成。我尝试在UpdatePanel中包装按钮但是我得到一个“Update方法只能在Render'错误之前在ID为'xxxx'的UpdatePanel上调用。我理解为什么会出现问题,但我想不出解决方案。帮助!< / p>

理想情况下,我想做的只是在事件中调用一个方法来更新UI,但我不知道是否可能。

修改

这是一些示例代码。我无法发布确切的代码,但这解释了问题:

Partial Class ExampleUserControl
    Inherits Inherits System.Web.UI.UserControl

    Private WithEvents obj As MyObj

    Private Sub btnOn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOn.Click
        obj = New MyObj()
        obj.On() ' Calls OnEvent on success
    End Sub

    Private Sub btnOff_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOff.Click
        obj = New MyObj()
        obj.Off() ' Calls OffEvent on success
    End Sub

    Private Sub On() Handles obj.OnEvent
        btnOn.Enabled = False
        btnOff.Enabled = True
        'updatePanel.Update() This throws an exception
    End Sub

    Private Sub Off() Handles obj.OffEvent
        btnOn.Enabled = True
        btnOff.Enabled = False
        'updatePanel.Update() This throws an exception
    End Sub

End Class

3 个答案:

答案 0 :(得分:1)

你不能只是将html“推送”到浏览器,更新面板。您只能对浏览器中的“拉”做出反应。

因此,您需要每隔 x 秒让更新面板自行刷新一次。 然后您可以检查服务器端状态并相应地更新面板。

例如参见:http://ajax.net-tutorials.com/controls/timer-control/

操作完成后,别忘了关闭计时器。

答案 1 :(得分:0)

我不能评论,否则我会,所以我会在这里问我的问题。您是否尝试将启用逻辑直接放在btnOn_Click事件处理程序中并将btnOn作为触发器添加到updatepanel?我担心的是,辅助事件不是UpdatePanel上的触发器,因此更新事件不会查找该事件。

像这样:

 Private Sub btnOn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOn.Click
        btnOn.Enabled = False
        btnOff.Enabled = True
    End Sub

答案 2 :(得分:0)

使用UpdatePanel解决此问题。

为你的按钮制作AsyncPostBackTrigger。根据您在后面的代码上的逻辑启用或相应地禁用它们。

或者,从服务器端注册客户端脚本。