глобальная переменная в ASPX C # - PullRequest
1 голос
/ 18 ноября 2009

Я пишу страницу 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, все в порядке; НО я открываю свой проект в другом интернет-обозревателе и вижу, что на новой открытой странице значение _Total равно 50. ТАК проблема в глобальной переменной _Total слишком глобальный :) На двух страницах обозревателя Интернета показано ТОТ ЖЕ значение в _Total, на обоих _Totals равно 50; Должно быть так; Первая страница _Total - 50 ОК, но страница New IE должна быть _Total - 0; Не так ли?

Так как я могу решить эту проблему? Спасибо;

Ответы [ 3 ]

3 голосов
/ 18 ноября 2009

Статические переменные являются глобальными для приложения. В asp.net существует только один экземпляр приложения, который эффективно запускается веб-сервером, и все браузеры пользователей совместно используют. Как д. упоминает, что есть различные способы для поддержания состояния, если это то, что вам нужно, один из которых - viewstate, другие опции - скрытые поля и объект контекста страницы.

Статья (хотя и немного устаревшая) о состоянии 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();
    }

}

Если вы сейчас откроете два окна браузера, а затем нажмете одну кнопку на одном экране и другую кнопку на другом экране и подождите несколько секунд, вы увидите, что оба отчета сообщают об одном и том же результате в своем текстовом поле. Трудно объяснить ... но надеюсь, что это поможет.

2 голосов
/ 18 ноября 2009

Публичная статическая переменная будет вести себя так. Если вы хотите сохранить значение _Total при обратной передаче страницы, рассмотрите следующее

public decimal _Total {
   get { return (decimal) ViewState["_total"]; }
   set { ViewState["_total"] = decimal; }
}
0 голосов
/ 18 ноября 2009

Если вы нажмете 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, после чего итог был «предварительно заполнен».

Несмотря на это, я думаю, что вы используете "static" как "VB-ism" - попробуйте его без, и я думаю, что вы будете в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...