2011-12-29 5 views
1

У меня есть главная страница с выходом на нее. Когда пользователь нажимает на ссылку, я называю следующий метод:Предотвращение жизненного цикла страницы?

private void Logout() 
    { 
     SessionBll.DeleteSessionEntry(this.sessionId); 
     FormsAuthentication.SignOut(); 
     Roles.DeleteCookie(); 
     LogHelper.Location = string.Empty; 

     LogHelper.Info(logger, HttpContext.Current.User.Identity.Name, 
      MethodBase.GetCurrentMethod().Name, "User has been logged out from 
       Administrator.Master", LogMessage.LoggedOut); 
     FormsAuthentication.RedirectToLoginPage(); 
    } 

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

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

Как пропустить жизненный цикл страницы, но все еще вызываю этот метод?

Спасибо.

+0

В качестве побочного примечания, если вы не хотите испытывать жизненный цикл страницы веб-форм ASP.NET, я бы предложил вам посмотреть ASP.NET MVC. –

+0

Вы не можете предотвратить некоторые события. Если вы действительно хотите вызвать Logout как можно скорее, сделайте это, переопределив 'OnInit', а затем просто вызовите' Response.End() '. –

ответ

1

Вы не можете пропустить жизненный цикл страницы; что вы можете сделать вместо этого заключается в следующем:

Изменить что logout ссылка на обычную ссылку (<a href="...">) и на Page_Load на Login страницы, выполнить этот код размещен, но только if(!IsPostBack)

Редактировать

Если ваша страница входа в систему должна знать (как вы ее выразили), когда нужно выполнить код очистки; Вы можете передать параметр по ссылке выхода из системы, как так:

<a href="Login.aspx?Logout=y" > Logout </a> 

А затем проверить на Page_Load:

if (!IsPostBack && Request.QueryString["Logout"]=="Y") 
{ 
    //Your code here 
} 

Это очень быстро.

+0

Не знаю, понял ли я еще. Как будет известна страница входа в систему, если предполагается вызвать метод «Выход из системы»? Эта страница в настоящее время используется для входа пользователя, а не из. –

+0

@ subt13: Ну, если «нужно знать» (как вы выразились), вы можете передать параметр по этой ссылке (например, ' а затем проверьте, что 'Request.QueryString [" Logout "] ==" Y "' на 'Page_Load', так что вы точно знаете, что можете вызвать код очистки. – Icarus

+0

@ subt13: отредактировал мой ответ. Думаю, сейчас очень ясно. – Icarus

1

Используйте то, что не имеет жизненного цикла - ASP.NET MVC, как кто-то предложил или создаст .ashx (обработчик): logout.ashx просто выйдет из системы вошедшего в систему пользователя. Это будет работать без изменения структур.

Это не часто делается, однако, как правило, вы использовали бы другую страницу, которая по-прежнему будет иметь полный жизненный цикл (в соответствии с ответом Икара).

+0

Мне нравится ваша идея ashx. Изменение фреймворков для этого одноразового использования Однако это имеет смысл. –

+0

Добавление .ashx не меняет рамки, кстати, это были две отдельные идеи (просто очистка) :) –

1

Вызывайте совершенно другую страницу, которая выполнила бы только Logout task без другого соответствующего кода. Таким образом, вам не нужно беспокоиться о жизненном цикле страницы.

3

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

Я считаю, что проблема заключается в том, что страница по-видимому, делает слишком много на странице цикл. В WebForms происходит цикл страницы. Это как раз то, как это работает. Рассмотрите это ...

  • Чтобы взаимодействовать с кодом, клиентская форма должна быть отправлена ​​на страницу.
  • Для обработки POST страница должна существовать в памяти.
  • Для того, чтобы существовать, страница должна пройти свои стандартные этапы создания в своем жизненном цикле.

Не видя никакого действительного кода, моя реакция кишки заключается в том, что вы делаете слишком много на Page_Load. Измените это. Делайте только то, что вам нужно сделать, чтобы загрузитьстраница. Не обрабатывать данные, а не выполнять все виды фоновых операций, просто загрузите страницу. Это должен быть довольно легкий процесс. Затем логически подключите необходимые фоновые работы, где это необходимо. (В WebForms, и это является одним из основных огорчает мой, это часто заканчивается как упаковка много вещей в условном проверить IsPostBack.)

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

  • Сделать ссылку выхода из системы не более простой ссылкой. Таким образом, браузер будет запрашивать только страницу выхода из системы, а не создавать форму POST на текущей странице (как, например, с кнопкой или LinkButton).
  • Если на странице выхода из системы на самом деле требуется какое-то значение POSTED, сделайте ее собственным HTML form с действием, установленным на странице выхода. Это связано с меньшей нагрузкой на элементы управления перетаскиванием на стороне сервера и многое другое на простое создание простого HTML (что всегда хорошо, что можно сделать в веб-разработке).

Или, думая о вашем вопросе немного больше, вы спрашиваете, как сделать страницу выхода из системы пропустить цикл главной страницы? Если страница выхода из системы использует главную страницу, то она не может пропустить ее. Страница должна существовать до ее использования. Но вы можете создать автономную страницу выхода без главной страницы, которая ничего не делает, кроме как обрабатывать выход (а затем перенаправить, я полагаю, на другую страницу). Это приведет к быстрому выходу из системы, но в целом все же требуется, чтобы страница загружалась где-то. Это возвращает нас к тому, что проблема заключается в том, что страница занимает слишком много времени для загрузки, а не для загрузки страницы.

+0

Я ценю ваш ответ. Эта основная страница используется многими страницами контента.Каждая страница page_preinit/init/load/etc на странице содержимого будет содержать в себе различную логику, поэтому некоторые страницы занимают больше времени, чем другие. Я считаю, что чрезмерное упрощение полагает, что можно просто уменьшить/изменить коды в этом событии для каждой страницы контента. FormsAuthentication.RedirectToLoginPage(); отправляет пользователя на страницу входа (не на страницу выхода). Итак, вы говорите, чтобы переместить метод «Выйти» на новую страницу (например, Logout.aspx), а затем поместить ссылку на эту страницу, которая вызывает метод «Выход из системы» –

+0

@ subt13: это совсем не упрощение. Если приложение было спроектировано с логикой в ​​неправильных местах, то действительно было бы существенным усилием исправить это. Но поставить логику в правильные места в первую очередь не совсем неслыханно. Что касается страницы выхода, вы можете иметь отдельную страницу, которая выполняет выход из системы. Возможно, пустая страница без главной страницы, которая выполняет функцию «Logout()» на странице «Page_Load», что приводит к перенаправлению на страницу входа в систему. Это пропустит шаг повторной загрузки страницы _current_, чтобы выполнить выход из системы. – David

+0

На некоторых страницах содержимого мне нужно получить доступ к базе данных до page_load для создания динамического управления. Другого места для логики не существует, поэтому я не собираюсь возвращаться к этому (и использование IsPostBack не всегда может быть использовано). В таком случае вы и Томислав говорите то же самое. –

Смежные вопросы