在使用Ajax计时器控件时,我在尝试写入页面类的实例成员时遇到了一个问题。
我已经建立了一个非常简单的粗糙例子,下面模拟了我遇到的确切问题…
下面的代码使用计时器控件每秒执行一个名为“updateText”的方法。每次调用该方法时,它都会将计数器变量递增一个,以说明计时器控件进行回调的次数。
当然,为了将计数器的值读取到网页上,标签位于一个更新面板内,该面板带有一个与计时器关联的触发器。
Markup:
<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>
CodeBehind:
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”变量是静态的,因为它将应用于整个应用程序级别,所有用户都将读/写同一个变量。
当我试图删除静态关键字时,loopcounter变量不再更新,它只是保持在零…代码或浏览器(javascript)中没有给出错误。
我已经找到了一个临时的解决方法,使用会话代替它,它可以很好地工作并保持在用户的上下文中,但是我更喜欢不使用会话,除非我真的需要这样做。
有人能解释一下为什么“实例”成员不能写入
这样地?为什么它只适用于
静态的?