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 になっています。SO 問題は、グローバル変数 _Total がグローバルすぎることです:) 2 つの Internet Explorer ページの _Total に同じ値が表示されます。どちらも _Totals は 50 です。このように違いありません。最初のページの _Total は 50 OK ですが、新しい IE ページは _Total が 0 でなければなりません。ではない?

では、どうすればこの問題を解決できますか? ありがとう;

4

3 に答える 3

3

静的変数は、アプリケーションに対してグローバルです。asp.net では、アプリケーションのインスタンスは常に 1 つしかなく、Web サーバーによって効果的に実行され、すべてのユーザー ブラウザーが共有します。dとして。状態を維持するにはさまざまな方法があると述べていますが、そのうちの 1 つはビューステートであり、他のオプションは隠しフィールドとページ コンテキスト オブジェクトです。

asp.net状態に関する記事(少し古いですが)

Sohnee の答えは、asp.net プログラミングではあまりにも一般的な誤解であり、ナイトメアのデバッグにつながります。基本的に、アプリを開発している間はいつでも問題なく動作します。その後、妥当な数の訪問者を獲得すると (つまり、ライブになるとすぐに)、顧客またはテスターが非常に奇妙で一貫性のない結果を報告していることに気付くでしょう。ページの静的変数は、そのページのすべてのインスタンスに対してグローバルです。つまり、そのページにアクセスするすべてのブラウザーに適用されます。彼の例を修正していくつかのスリープを追加し、実際のサーバーで発生する可能性があること (ラグ) をエミュレートできるようにしました。

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();
    }

}

2 つのブラウザー ウィンドウを開き、一方の画面で 1 つのボタンを押し、もう一方の画面でもう 1 つのボタンを押して数秒待つと、両方のテキスト ボックスに同じ結果が表示されることがわかります。説明するのが難しい...しかし、それが役に立てば幸いです。

于 2009-11-18T08:55:38.373 に答える
2

public static 変数はそのように動作します。ページのポストバック中に _Total の値を維持したい場合は、次のことを考慮してください。

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

CTRL+N を押して新しいウィンドウを取得すると、この動作が見られます。フレッシュから新しいウィンドウを開いて URL に移動すると、これは表示されません。

私はあなたのコードをほぼ正確にテストしましたが、2 つの完全に別個のブラウザー ウィンドウ間で _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 に答える