Переменная, инициализированная в классе, теряет свое предыдущее значение при загрузке страницы
Я объявил тест переменной 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;
}
}
Ответы
Ответ 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";
.