Переменная, инициализированная в классе, теряет свое предыдущее значение при загрузке страницы - программирование
Подтвердить что ты не робот

Переменная, инициализированная в классе, теряет свое предыдущее значение при загрузке страницы

Я объявил тест переменной String с "привет". каждый раз, когда я нажимаю кнопку Button1, я ожидаю, что тест будет добавлен с его предыдущим значением. Но я заметил, что он теряет свое предыдущее значение, когда кнопка нажата, и страница перезагружается. Это каждый раз, когда я нажимаю на него, он имеет свой текст как "hihi". Я ожидаю "хихихихи" на следующий клик и так далее. В чем проблема с приведенным ниже кодом?

public partial class _Default : System.Web.UI.Page
{

    String test = "hi";

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        test += test;
        Button1.Text = test;
    }
}
4b9b3361

Ответ 1

Нет, это не так, как работает asp.net. Если вам нужно это поведение, вы должны сделать это:

public string test {
  get {
    return (string) ViewState["test"] ?? "hi";
  }
  set {
    ViewState["test"] = value;
  }
}

Когда ASP.NET отправляет запрос на сервер, создается новая версия вашего класса. Если вам нужно получить состояние, вам нужно использовать ViewState (который сохраняется в скрытом поле в браузере и отправляется с каждым запросом и, следовательно, сохраняется состояние на странице), или вы можете использовать SessionState, состояние которого сохраняется на пользователя, SessionState по умолчанию сохраняется в памяти. Итак, если вы перезапустите IIS, это состояние исчезнет. Обратите внимание, что состояние viewstate не исчезнет, ​​если вы reset IIS (поскольку он отправляется браузером). Вы также можете использовать Cache, который снова сохраняется в памяти. Это состояние предназначено для всех пользователей вашего приложения. Те же правила об изменении IIS применяются. Наконец, вы можете сделать свою переменную статичной. Как я уже сказал, каждый раз, когда запрос выполняется, создается новая версия вашего класса. Конечно, статические переменные не являются переменными экземпляра, поэтому состояние статической переменной сохраняется и через обратные передачи. Те же правила IIS reset применяются к статическим переменным как кэш и сеанс.

Ответ 2

Поле существует только для продолжительности одного запроса. Если вы хотите, чтобы он работал между запросами, вам нужно будет использовать что-то вроде состояния сеанса, состояния представления, файла cookie или значения формы/запроса HTML.

В большинстве "реальных" приложений вы даже не можете гарантировать, что последующие запросы обрабатываются одной и той же физической машиной.

Ответ 3

Каждый раз, когда вы посещаете страницу, создается новый экземпляр страницы с собственной копией локальной переменной. Существует несколько способов сохранения значений с одного просмотра страницы на следующий, и все они описаны здесь: Обзор управления ASP.NET в ASP.NET

Ответ 4

String test = "hi";

Это частное поле класса экземпляра.

Вам нужна статическая, если вы хотите достичь своей цели.

Кстати, возможно, вы хотите использовать элемент сеанса:

HttpContext.Current.Session["test"] = "hi";

Таким образом, у вас будет такой код в обработчике событий:

string currentTestText = (string)HttpContext.Current.Session["test"];

currentTestText += currentTestText;
Button1.Text = currentTestText;

HttpContext.Current.Session["test"] = currentTestText;

Ответ 5

Thats, потому что кнопка генерирует POST BACK, вы можете объявить переменную как статическое свойство или создать сеанс [ "Test" ] или добавить код на кнопку click, если IsPostback {}

Ответ 6

Помните, что в postback asp.net воссоздает объекты и переназначает значения. В вашем случае тестовая переменная воссоздается и получает значение "hi". Возможно, вы захотите сохранить переменную в сеансе, а затем добавить значение.

Ответ 7

Проблема с вашим кодом заключается в том, что при каждом запросе ваш экземпляр Page воссоздается, поэтому test не сохранит предыдущее значение, так как оно принадлежит новому экземпляру Page.

Это поток:

Запрос 1 Пуск

Page is created -> test = "hi"

Запрос 1 заканчивается

Page is detroyed

Запрос 2 Пуск

Page is created -> test = "hi"

Request 2 Ends

Page is detroyed

Ответ 8

Это работает, просто попробуйте

// in the page load event
if(!this.IsPostBack)
   Button1.Text = test;

// in the Click event
this.Button1.Text += test;

Проблема с вашим текущим кодом заключается в том, что вы назначаете переменную экземпляра для текста кнопки, так как она является переменной экземпляра, она инициализируется каждый раз, когда вы запрашиваете страницу с помощью такое же значение, что вы всегда получаете hihi и не hihihihihihihihi

Каждый раз, когда вы нажимаете кнопку, ASP.Net создает new Page(), поэтому элемент test всегда будет инициализирован как: test = "hi";.