2009-07-07 8 views
8

Я не знаю много об ASP.Net, но я пытаюсь создать новый элемент управления для окна сообщений. Вы вводите некоторую информацию и нажимаете кнопку.ASP.Net: Page_Load() вызывается несколько раз

Однако, по какой-то странной причине, когда кнопка нажата, страница_Load() вызывается во второй раз, и все переменные-члены сбрасываются на нуль! Мне нужны эти переменные, а Page_Load() не имеет смысла вызываться во второй раз! Конечно, стоп-колл бесполезен.

+0

Почему стек вызовов бесполезен? Пожалуйста, разместите его копию, чтобы мы могли видеть, кто инициировал вызов вашего метода загрузки. –

+0

У вас есть javascript, позволяющий позвонить в веб-метод? – NotMe

+0

Все, что показано выше Page_Load() - [Внешний код] – evilfred

ответ

16

Помните, что в ASP.Net каждый раз, когда вы вызываете постбэк любого рода, включая обработку событий, как при нажатии кнопок, вы работаете с брендом новый экземпляр класса вашей страницы, который необходимо перестроить с нуля. Любая работа, которую вы делали ранее для создания страницы на сервере, - ушла. Это означает, что весь жизненный цикл страницы составляет всего, включая код загрузки страницы, а не только код клика.

Всегда два, не более, не менее. Запрос и ответ.

+1

guhhh поэтому переменные экземпляра бесполезны? это странно, потому что я делал то же самое в другом месте на веб-странице, и они отлично работают, я не случайно попал в рекомментацию, как бы то ни было. – evilfred

+1

Переменные экземпляра полезны для хранения данных между событиями в одной и той же обратной передаче. Например, вы можете открыть соединение sql раньше и использовать это же соединение позже в жизненном цикле. Если переменные экземпляра работают в другом месте по обратной стороне, вы, вероятно, полагаетесь на ViewState. –

+0

+1 для размышлений о * самой очевидной * вещи сначала, а не о передовых спекуляциях! –

4

Когда страница отправляется назад, вызывается метод Page_Load. Затем, как только сервер фактически обрабатывает страницу и отправляет вам новую, основанную на изменениях, страница_Load вызывается снова, на самом деле первый раз на новой странице, отправленной вам.

Так что, если вы тянете данные в случае Page_Load или установить некоторые значения, заключите его в следующем блоке:

if(!Page.IsPostBack) 
{ 

} 

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

Это помогает проанализировать жизненный цикл ASP.Net странице :)

0

Просто выстрел в темноте, но, возможно, добавить это после Page_Load:

if (!IsPostBack) 
{ 
1

Как уже упоминалось Joel, переменные экземпляра будут потеряны после страница отправляется обратно клиенту. Однако существуют различные способы хранения значений ваших переменных, чтобы вы могли их позднее загрузить. Эта страница на State Management является хорошей отправной точкой, если вы хотите узнать больше.

1

Любой тег/элемент, который требует ссылки на url, например img, anchor, object etc, должен быть проверен для пустой ссылки.

например. href = "", url = "", src = "" - некоторые распространенные ошибки.

1

Этот код работает для меня:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (Session["something"] == null) 
     { 
      Session["something"] = "1"; 
     } 
     else 
     { 
      Session["something"] = null; 

      //your page load code here 

     }    
    } 
} 
1

Для меня этот вопрос был немного сложнее, но я обнаружил, что обработчик

protected override void OnPreRender(EventArgs e)

вызывается только один раз, так что безопаснее чтобы совершить некоторые действия там, если вам не слишком поздно кончать.

-1

вы можете использовать сессии или ViewState для сохранения значений переменных ..

  1. если вы хотите перенаправить на другую страницу, использование сессии []
  2. еще, если вы хотите, чтобы остаться на том же page, use viewstate []
Смежные вопросы