Как обновить страницу в ASP.NET? (Пусть он перезагрузится сам по коду)

158

Как обновить страницу в ASP.NET? (Пусть он перезагрузится сам по коду)

Я бы предпочел не использовать Response.Redirect (), потому что я не знаю, на какой странице я буду находиться, так как она находится внутри пользовательского элемента управления внутри веб-части внутри sharepoint.

Ахмад Фарид
источник
2
Я не OP, но одной из причин может быть то, что JavaScript можно отключить
Натан Куп
11
ASP.NET опирается на javascript, поэтому, если у пользователя отключен javascript, возникает большая проблема ...
jrummell

Ответы:

45

Как только страница отображается для клиента, у вас есть только два способа принудительного обновления. Одним из них является Javascript

setTimeout("location.reload(true);", timeout);

Второй метатег:

<meta http-equiv="refresh" content="600">

Вы можете установить интервалы обновления на стороне сервера.

Ариэль Поповский
источник
где я должен положить setTimeout?
Сити
Пожалуйста, смотрите ответ от @gaurav ниже для хорошего способа сделать это в .NET используя Server.TransferRequest.
сфарбота
Это может быть правильным для страницы, не использующей поддержку на стороне сервера, однако это неверно по отношению к указанному .Net. Правильный способ - использовать Response.Redirect.
Фил Хили
394

В моем пользовательском контроле после обновления данных я делаю:

  Response.Redirect(Request.RawUrl);    

Это гарантирует, что страница перезагружается, и она отлично работает из пользовательского элемента управления. Вы используете RawURL и не Request.Url.AbsoluteUriсохраняете какие-либо параметры GET, которые могут быть включены в запрос.

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

Крис
источник
4
@ chris вы бы использовали второй параметр в качестве Response.Redirect (Request.RawUrl, false)? По-видимому, это лучшая практика при использовании reponse.redirect. Что вы думаете?
aleafonso
@aleafonso: я никогда лично не использовал второй параметр, и у меня никогда не возникало никаких проблем, поэтому я не уверен, что он вас покупает. Но да, согласно документации, вы должны использовать 2-й параметр, но только если вы собираетесь вызывать CompleteRequest - который я никогда не беспокоил.
Крис
Иногда вам может понадобиться AbsoluteUri, когда текущая страница имеет параметр Id (например, вопросный идентификатор здесь в stackoverflow). Или я не прав?
CularBytes
2
@aleafonso прав - если вам не нужно остановить всю обработку на странице, что иногда свидетельствует о плохом планировании дизайна, вы должны передать false в качестве второго параметра. Если не передать второй параметр или значение true, генерируется исключение HttpException, что может повлиять на производительность и заполнить журналы событий.
Рипсайд
45

Это может быть поздно, но я надеюсь, что это поможет кому-то, кто ищет ответ.

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

Server.TransferRequest(Request.Url.AbsolutePath, false);

Старайтесь избегать использования, Response.Redirectпоскольку это увеличивает шаги в процессе. Что он на самом деле делает:

  1. Отправляет обратно страницу с перенаправлением заголовка
  2. Браузер перенаправляет на целевой URL.

Как видите, тот же результат занимает 2 поездки, а не 1 поездку.

dicemaster
источник
2
+1 за указание на то, что Server.Transfer () является более эффективным способом, чем Response.Redirect ()
Дженни О'Рейли
Это работало в тех случаях, когда Response.Redirect не работал правильно.
Эд Байятес
Я обнаружил, что это не очищает состояние страниц, например, набор .Textв TextBoxили .Visibleсостояние Button.
Облако
38

Попробуй это:

Response.Redirect(Request.Url.AbsoluteUri);
Эндрю Хэйр
источник
1
Он просто отправит страницу перенаправления вместо страницы, вызывая цикл, который браузер остановит, когда увидит, что он никогда не получит настоящую страницу ...
Гуффа
2
@Guffa, который полностью зависит от контекста, в котором используется перенаправление. Если он используется в блоке действия / кода, который специально вызывается на основе действия или условия, он будет срабатывать только один раз за каждую итерацию и при правильном кодировании изолированно.
Фил Хили
Это может привести к потере данных сеанса после перенаправления. Есть что-то в полностью определенных URL, которые портят сессии.
Крис Кадмор
13

Используйте javascript метод location.reload () .

<script type="text/javascript">
  function reloadPage()
  {
    window.location.reload()
  }
</script>
jrummell
источник
8

Существуют различные способы обновления страницы в asp.net, например ...

Java Script

 function reloadPage()
 {
     window.location.reload()
 }

Код позади

Response.Redirect(Request.RawUrl)

Метатег

<meta http-equiv="refresh" content="600"></meta>

Перенаправление страницы

Response.Redirect("~/default.aspx"); // Or whatever your page url
Сунил Ачарья
источник
6

Если вы не хотите выполнять полное обновление страницы, то как насчет упаковки того, что вы хотите обновить, внутри UpdatePanel, а затем выполнить асинхронную обратную передачу?

Брайан Денни
источник
3

Мне лично нужно убедиться, что страница сохраняет состояние, чтобы все текстовые поля и другие поля ввода сохраняли свои значения. выполняя метаобновление, это похоже на новый пост, IsPostBack всегда ложен, поэтому все ваши элементы управления снова находятся в инициализированном состоянии. Чтобы сохранить состояние, поместите это в конец вашего Page_Load (). создайте скрытую кнопку на странице с подключенным событием, что-то вроде butRefresh с событием butRefresh_Click (...). Этот код устанавливает таймер на странице для запуска обратной передачи так же, как пользователь сам нажимает кнопку обновления. все состояние и сеанс сохраняются. Наслаждайтесь! (PS вам может понадобиться поместить директиву в заголовок @Page EnableEventValidation = "false", если вы получаете сообщение об ошибке при обратной передаче.

//tell the browser to post back again in 5 seconds while keeping state of all controls
ClientScript.RegisterClientScriptBlock(this.GetType(), "refresh", "<script>setTimeout(function(){ " + ClientScript.GetPostBackClientHyperlink(butRefresh, "refresh") + " },5000);</script>");
JJ_Coder4Hire
источник
2

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

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

ScriptManager.RegisterStartupScript(this, GetType(), "refresh", "window.setTimeout('window.location.reload(true);',5000);", true);
Guffa
источник
2

В вашем page_load, добавьте это:

Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.Expires = -1;
sjehutch
источник
1
Response.Write("<script>window.opener.location.href = window.opener.location.href </script>");
Фарханой
источник
1

Вы можете использовать 2 способа решения этой проблемы: 1) После тега head

<head> 
<meta http-equiv="refresh" content="600">
</head>

2) Если на вашей странице нет тега head, вы должны использовать Javascript для реализации

<script type="text/javascript">
  function RefreshPage()
  {
    window.location.reload()
  }
</script>

Мой контакт:

http://gola.vn

Том
источник
1

Единственный правильный способ обновления страницы был через JavaScript, многие из топовых ответов .NET потерпели неудачу для меня.

Response.Write("<script type='text/javascript'> setTimeout('location.reload(true); ', timeout);</script>");

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

Хаммад хан
источник