gpt4 book ai didi

c# - Ajax TimerControl 和实例变量?

转载 作者:行者123 更新时间:2023-11-30 17:21:34 24 4
gpt4 key购买 nike

在使用 Ajax 计时器控件时,我在尝试写入页面类的实例成员时遇到了问题。

我在下面构建了一个非常简单的粗略示例,它模拟了我遇到的确切问题...

下面的代码使用计时器控件每秒执行一个名为“UpdateText”的方法。每次调用该方法时,它都会将计数器变量递增 1,以说明计时器控件进行了回调的次数。

当然,为了将计数器的值读取到网页上,标签位于更新面板内,并带有与计时器关联的触发器。

标记:

<form id="form1" runat="server">
<div>

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="UpdateText">
</asp:Timer>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label runat="server" Text="" ID="lblCounter"></asp:Label>
</ContentTemplate>

<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" />
</Triggers>
</asp:UpdatePanel>

</div>
</form>

代码隐藏:

public partial class TimerControl : System.Web.UI.Page
{
private static int loopCounter = 0;


protected void Page_Load(object sender, EventArgs e)
{
}

public void UpdateText(object sender, EventArgs e)
{
lblCounter.Text = loopCounter.ToString();
loopCounter++;
}

}

如果你运行它,你会发现它很好用,但我不希望“loopCounter”变量是静态的,因为这将应用于整个应用程序级别,所有用户都将读/写同一个变量.

当我尝试删除 static 关键字时,loopCounter 变量不再更新,它只是保持为零...代码或浏览器 (JavaScript) 中没有给出任何错误。

我找到了一个临时的变通方法,使用 session 来代替,它工作得很好并且保留在用户的上下文中,但我不喜欢使用 session ,除非我真的必须这样做。

Could anyone please explain why an 'instance' member cannot be written to like this? Why does it only work for static?

最佳答案

发生这种情况的原因本质上是因为 http 是一种无状态协议(protocol)。您的问题的具体原因是页面实例在请求完成后未保存在内存中。每次向 ASP.NET 页面发出请求时,都会创建一个新的页面实例。您可以通过向您的页面类添加一个默认构造函数并在其中放置一个断点来轻松地自行检查这一点。

除了使用 session 状态,你还可以使用viewstate为了这。在这种情况下,这可能是更好的解决方案,因为您使用的数据(您的计数器)不是特定于用户的,而是特定于页面的。

关于c# - Ajax TimerControl 和实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3275464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com