Глобальная переменная равна нулю

Dictionary<string, string> propertyCompany = new Dictionary<string, string>();//gloabal variable

protected void Page_Load(object sender, EventArgs e)
{
   if(!isPostBack){
      propertyCompany .add("a","1"); 
      propertyCompany .add("b","2");
      propertyCompany .add("c","3");
   }
}

protected void btnGetProperty_Click(object sender, EventArgs e)
{
      string a=propertyCompany["a"];//error this key is not exist
     //propertyCompany is null
}

когда определить propertyCompany и заполните form_load, при нажатии на кнопку propertyCompany нулевой!?

я использую static но я не понимаю, что иногда говорят, что ошибка равна нулю.

6 ответов

Решение

Каждый запрос создает новый объект страницы, поэтому вы не можете использовать словарь второго запроса (bnt click), который вы создали в первом запросе (загрузка без обратной передачи)

Удалить тест для обратной передачи для быстрого исправления.

Другие возможности исправления: * Храните словарь в viewstate.

Каждая переменная, определенная в классе, наследует Web.UI.Page будет уничтожен в конце жизненного цикла страницы, следовательно, он будет null в Postback, если вы не инициализируете его.

Один из способов сохранить его в постбэках - сохранить его в переменной Session.

Вы найдете полный список всех вариантов сохранения переменных в обратных передачах здесь: http://msdn.microsoft.com/en-us/magazine/cc300437.aspx

  • заявка
  • Печенье
  • Форма сообщения / скрытое поле формы
  • Строка запроса
  • сессия
  • Новые государственные контейнеры в ASP.NET
  • кэш
  • контекст
  • ViewState
  • Заключение по файлам Web.config и Machine.config

По своей природе HTTP-протокол не имеет состояния.

Я уверен, что ваш заголовок должен быть "глобальная переменная не содержит данных, которые я хочу". Словарь будет создаваться каждый раз, когда страница загружается (постбэк или иным образом), но из-за этой строки:

if(!isPostBack) {
}

он не будет иметь данные, которые вы хотите, по нажатию кнопки.

Чтобы уведомить страницу о клике, выполняется обратная запись, так сказать !isPostBack (который я предполагаю, установлен где-то через Page.IsPostBack) также говорит "если я не нажал кнопку", что, конечно, не то, что вы хотите.

Чтобы получить желаемую функциональность, вы должны либо вывести заполнение словаря из блока if, либо иметь условие else, которое также заполняет его нужными вам данными.

Другой альтернативой использованию переменной класса является хранение данных в другом месте. Варианты включают ViewState, Session, Application (если это действительно данные для всего приложения), то Cache и некоторые другие. Непонятно, что именно делает словарь, поэтому трудно сказать, какое место будет наиболее подходящим.

Один из способов заставить ваш словарь жить между запросами - объявить его статическим или в viewstate, как было предложено ранее.

Как вы получаете доступ к элементам в propertyCompany в событии нажатия кнопки? Если вы делаете это неправильно, это более вероятно, проблема.

Попробуй это

    Dictionary<string, string> propertyCompany;//gloabal variable

protected void Page_Load(object sender, EventArgs e)
{ 
   propertyCompany = new Dictionary<string, string>();
   if(!isPostBack){
      propertyCompany .add("a","1"); 
      propertyCompany .add("b","2");
      propertyCompany .add("c","3");
   }
}

protected void btnGetProperty_Click(отправитель объекта, EventArgs e) { //propertyCompany имеет значение null }

Другие вопросы по тегам