ASP.NET - некоторые переменные-члены не работают должным образом? - PullRequest
0 голосов
/ 08 марта 2011

Я работаю в ASP.NET - только начинаю, и у меня довольно простой вопрос. У меня есть кнопка, и когда вы нажимаете на нее, она добавляет простой текст в раскрывающемся списке. Вот код:

public partial class _Default : System.Web.UI.Page
{
    private int buttonclickedtimes = 1;
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        this.DropDownList1.Items.Add(new System.Web.UI.WebControls.ListItem("Clickin' mah buttonz " + buttonclickedtimes + " times!"));
        buttonclickedtimes++;
    }
}

Но buttonclickedtimes всегда выступает как единое целое. Если я сделаю переменную статической, она будет работать как задумано. Но DropDownList - это переменная-член, и она явно соответствует состоянию и работает, как я ожидаю. Я не понимаю этого поведения - конечно, все переменные-члены либо сохраняются, либо не сохраняются между запросами? Я работаю в режиме отладки в VS2010.

Ответы [ 5 ]

3 голосов
/ 08 марта 2011

Нет, переменные-члены не сохраняются между запросами, если вы хотите сохранить их, вам нужно поместить их в Viewstate.

Состояние элемента управления сохраняется в Viewstate (если у вас включено viewstate), так чтопочему он сохраняется между запросами.

Чтобы сохранить в Viewstate, добавьте в метод Pre_Render следующее:

ViewState.Add("buttonClickTracker", buttonclickedtimes);

И затем получите доступ к нему:

buttonclickedTimes = Viewstate["buttonClickTracker"];

1 голос
/ 08 марта 2011

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

Итак, если вы хотите сохранить данные между несколькими запросами, вам придется использовать какой-то механизм, например, переменные sesison, для их хранения.

например. Session["ButtonClickedTimes"] +=1; будет увеличивать его после каждого запроса.

0 голосов
/ 08 марта 2011

Поскольку веб-приложение не имеет состояния ... оно инициирует переменную каждый раз, когда перезагружает страницу.Вот почему у нас есть проверка Page.IsPostback.

Для состояния вы должны либо использовать viewstate, либо состояние сеанса ....

Статические классы имеют один intance и, следовательно, они сохраняют значение независимо от страницы.загружает ...

Надеюсь, это поможет вам.

0 голосов
/ 08 марта 2011

Это сводится к «проблеме» жизненного цикла страницы.То, что происходит, - то, что страница построена (и Ваше время нажатия кнопки установлено в начальное значение 1).Затем он проходит жизненный цикл страницы (инициализация, загрузка, обработка событий, рендеринг и т. Д.), И освобождение памяти для переменной освобождается.Однако, когда переменная является статической, сервер знает, как зависеть от выделения памяти для переменной, и любые изменения в ней сохраняются.Однако эта статическая переменная сохраняется для этой страницы.Это означает, что для x пользователей, которые нажимают вашу кнопку, эта переменная будет увеличена в x раз.

Если вы хотите, чтобы переменная сохранялась для отдельного пользовательского экземпляра, вы можете использовать ViewState или, возможно, состояние Session для сохранения информации.

Надеюсь, это полезно.

0 голосов
/ 08 марта 2011

В ASP.NET Страница создается каждый раз, когда она публикуется .

Итак, ваша локальная переменная 1, потому что класс _Default - это новый класс каждый раз, когда вы нажимаете кнопку.

Если вы хотите сохранить состояние, вы можете использовать объект ViewState или объект Session.

Я рекомендую вам прочитать некоторые из обзоров ASP.NET Дино Эспозито на MSDN, он хорошо объяснит все это.

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