2010-12-08 3 views
1

У меня есть таймер, который проверяет некоторые условия и, как условие становится истинным оно имеет для перенаправления на страницу сasp.net таймер и Response.Redirect

 protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      /* Thread th = new Thread(new ThreadStart(OtherThread)); 
      th.Start();*/ 
      System.Timers.Timer t = new System.Timers.Timer(9000); 
      t.Enabled = true; 
      t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed); 
      Session["total"] = 0; 
     } 
    } 
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
if(db.getvalue()==true) 
    response.redirect("abc.aspx"); //notworking 
    //server.transfer("abc.aspx"); //not working 
} 

Как я перенаправить мою страницу. Есть ли способ сделать это с помощью js или чего-нибудь еще?

+0

Возможно, db.getvalue() является ложным? – Greg 2010-12-08 06:46:11

+0

Уточните вопрос: у вас есть страница и таймер в фоновом режиме, который не имеет отношения к посетителю. Страница будет обслуживаться в обычном режиме. Когда идет обратный отсчет таймера, вы хотите начать перенаправление посетителей с этой страницы на другую страницу. ЭТО ВЕРНО? – Poni 2010-12-08 06:48:43

+0

@poni: Да, у меня почти такой же сценарий. так что я должен делать в этом случае. – 2010-12-08 06:50:56

ответ

5

После того, как вы выбрали страницу, слишком поздно отправить перенаправление: ответ уже отправлен, поэтому объект ответа у вас уже недействителен.

Вместо этого, вы должны будете иметь дело с ним или в стороне клиента код сценария с чем-то вроде

window.setTimeout(function() { window.location.href = "blah.aspx"; }, 9000); 

или установив Refresh заголовок в ответ сказать, на стороне клиента, что это будет необходимо в это время загрузите другую страницу.

Кроме того, создание экземпляра Timer изнутри такой страницы, вероятно, является плохими идеями - помимо того факта, что он содержит недопустимый объект ответа, таймер будет висели, даже если посетитель закрывает страницу, и это довольно дорогостоящий объект с точки зрения системных ресурсов.

С другой стороны, если вы просто хотите, чтобы проверить, что условие в фоновом режиме, настроить таймер в global.asax от вашего Application_OnStart события и он обновляет volatile булеву переменную; проверьте эту переменную в начале страницы, которую вы хотите условно перенаправить.

EDIT: Если вы хотите, чтобы условие проверяется для каждого открытого окна в любом браузере с указанием страницы, вам придется использовать либо сценариев или Refresh. Это может быть проще иметь таймер JavaScript интервала периодически пытаться перейти на специальную страницу «условно отводящей», которые состоят только из следующего кода, который проверяет состояние и либо перенаправляет или покидает страницу в одиночку:

<% 
    if (db.getvalue()) // saying "== true" is redundant 
     response.Redirect("abc.aspx"); 
    else 
     response.StatusCode = HttpStatusCode.NoContent; 
%> 

Примечания что переход к URL-адресу, который возвращает 204 «Без содержимого», заставляет браузер оставлять только существующую страницу. Кроме того, имейте в виду, что эта страница редиректора будет сильно подвергнута бомбардировке, поэтому держите ваш чек легким.

0
<script language="javascript"> 
    function redirectFunction() { 
     document.location.href = 'www.yourpage.com'; 
    } 
    </script> 
<body onload="javascript:setTimeout('redirectFunction();', 1000)"> 

Затем на нагрузке вы можете обрабатывать логику, если db.getvalue() = true, а затем перенаправить на страницу.
Чтобы избежать обновления всей страницы, выполните некоторые действия по созданию ajax-вызовов из javascript.

0
string myStringVariable = "Password Update!"; 
     ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + myStringVariable + "');", true); 

     Response.AddHeader("REFRESH", "1;URL=Login.aspx"); 
Смежные вопросы