1

我写了一个 ASPX c# 页面,我必须使用这样的全局变量;

public static Decimal _Total;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
          _Total=0; 
         }
    }

 public void ShowCekBanka()
    {
         _Total= 10 * 5;
    }

public void ShowNakitBanka()
{
      _Total= 10 * 10;
}

现在; 我在页面中放了 2 个按钮;Button1 是运行 ShowCekBanak() 函数;Button2 是运行 ShowNakitBanka() 函数;

当我第一次运行项目时,我单击 Button1 并且 _Total 为 = 50 没关系;但是我在另一个 Internet Explorer 中打开我的项目,我在新打开的页面中看到我的 _Total 值为 50。所以问题是全局变量 _Total 全局太多了 :) 两个 Internet Explorer 页面在 _Total 中显示相同的值,都是 _Totals 是 50;一定是这样的;First Page _Total 为 50 OK,但新建 IE 页面必须 _Total 为 0;不是吗?

那么我该如何解决这个问题呢?谢谢;

4

3 回答 3

3

静态变量对应用程序是全局的。对于 asp.net,只有一个应用程序实例,它由 Web 服务器有效运行,所有用户浏览器共享。作为 d。提到有多种方法可以维护状态,如果这是您所追求的,其中之一是视图状态,其他选项是隐藏字段和页面上下文对象。

asp.net 状态上的文章(虽然有点旧)

Sohnee 的回答在 asp.net 编程中是一个非常普遍的误解,并导致一些 NIGHTMARE 调试。基本上,在您开发应用程序的所有时间里,它都可以很好地为您工作。然后,当您获得合理数量的访问者(即一旦上线),您会发现客户或测试人员报告的结果非常奇怪且不一致。页面上的静态变量对于该页面的所有实例都是全局的 - 这意味着所有浏览器都访问该页面。我已经修改了他的示例,在其中添加了一些睡眠,以便我们可以模拟实时服务器上可能发生的情况(即延迟)。

public partial class _Default : System.Web.UI.Page 
{
    public static Decimal _Total;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
            _Total = 0;
            TextBox1.Text = _Total.ToString();
        }
    }

    public void ShowCekBanka(object sender, EventArgs e)
    {
        _Total = 10 * 5;
        System.Threading.Thread.Sleep(5000);
        TextBox1.Text = _Total.ToString();
    }

    public void ShowNakitBanka(object sender, EventArgs e)
    {
        _Total = 10 * 10;
        System.Threading.Thread.Sleep(5000);
        TextBox1.Text = _Total.ToString();
    }

}

如果您现在打开两个浏览器窗口,然后在一个屏幕上点击一个按钮,在另一个屏幕上点击另一个按钮,然后等待几秒钟,您将看到两者在其文本框中报告相同的结果。很难解释……但希望能有所帮助。

于 2009-11-18T08:55:38.373 回答
2

公共静态变量的行为就是这样。如果您想要在回发页面期间保持 _Total 的值,请考虑以下

public decimal _Total {
   get { return (decimal) ViewState["_total"]; }
   set { ViewState["_total"] = decimal; }
}
于 2009-11-18T08:44:29.457 回答
0

如果您按 CTRL+N 来获得一个新窗口,您将看到此行为。如果你从新鲜打开一个全新的窗口,然后转到 URL,你不应该看到这个。

我几乎完全测试了您的代码,它没有在两个完全独立的浏览器窗口之间保留 _Total 的值。这是您的代码,稍作调整。

public static Decimal _Total;
protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack == false)
    {
        _Total = 0;
        TextBox1.Text = _Total.ToString();
    }
}

public void ShowCekBanka(object sender, EventArgs e)
{
    _Total = 10 * 5;
    TextBox1.Text = _Total.ToString();
}

public void ShowNakitBanka(object sender, EventArgs e)
{
    _Total = 10 * 10;
    TextBox1.Text = _Total.ToString();
}

我运行该页面并单击一个按钮以获取除 0 以外的总数,然后打开一个新的浏览器,总数为 0。

然后我运行该页面并点击一个按钮以获取除 0 以外的总数,然后按 CTRL+N,然后“预填充”总数。

即便如此,我认为您对“静态”的使用是一种“VB 主义” - 尝试不使用它,我认为您会没事的。

于 2009-11-18T08:55:49.090 回答