Jak odświeżyć stronę w ASP.NET? (Pozwól mu przeładować się przez kod)

158

Jak odświeżyć stronę w ASP.NET? (Pozwól mu przeładować się przez kod)

Wolałbym nie używać Response.Redirect (), ponieważ nie wiem, czy strona, na której się znajdę, znajduje się w kontrolce użytkownika wewnątrz webpartu w sharepoint.

Ahmad Farid
źródło
2
Nie jestem OP, ale jednym z powodów może być to, że javascript można wyłączyć
Nathan Koop
11
ASP.NET opiera się na javascript, więc jeśli użytkownik ma wyłączony javascript, jest większy problem ...
jrummell

Odpowiedzi:

45

Po wyrenderowaniu strony do klienta masz tylko dwa sposoby wymuszenia odświeżenia. Jednym z nich jest Javascript

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

Drugi to metatag:

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

Możesz ustawić interwały odświeżania po stronie serwera.

Ariel Popovsky
źródło
gdzie powinienem umieścić setTimeout?
Siti
Zobacz odpowiedź od @gaurav poniżej, aby dowiedzieć się, jak to zrobić w .NET przy użyciu Server.TransferRequest.
sfarbota
Może to być poprawne w przypadku strony, która nie korzysta ze wsparcia po stronie serwera, jednak jest błędne w stosunku do określonego .Net. Poprawnym sposobem jest użycie Response.Redirect.
Phill Healey
394

W moich kontrolkach użytkowników po aktualizacji danych robię:

  Response.Redirect(Request.RawUrl);    

Zapewnia to ponowne załadowanie strony i działa dobrze z poziomu kontroli użytkownika. Używasz RawURL i nie Request.Url.AbsoluteUrizachowujesz żadnych parametrów GET, które mogą być zawarte w żądaniu.

Prawdopodobnie nie chcesz używać __doPostBack:, ponieważ wiele stron aspx zachowuje się inaczej podczas ogłaszania zwrotnego.

chris
źródło
4
@chris czy użyłbyś drugiego parametru jako Response.Redirect (Request.RawUrl, false)? Najwyraźniej jest to najlepsza praktyka podczas korzystania z reponse.redirect. Co myślisz?
aleafonso
@aleafonso: Nigdy osobiście nie korzystałem z drugiego parametru i nigdy nie miałem żadnych problemów z tego powodu, więc nie jestem pewien, co to kupuje. Ale tak, zgodnie z dokumentacją, powinieneś używać drugiego parametru, ale tylko wtedy, gdy zamierzasz wywołać CompleteRequest - z czym nigdy się nie przejmowałem.
chris
Czasami możesz potrzebować AbsoluteUri, gdy bieżąca strona ma parametr Id (jak na przykład questionId w stackoverflow). A może się mylę?
CularBytes
2
@aleafonso ma rację - chyba że musisz zatrzymać całe przetwarzanie na stronie, co czasami wskazuje na słabe planowanie projektu, jako drugi parametr należy podać fałsz. Nieprzekazanie drugiego parametru lub przekazanie wartości true powoduje zgłoszenie HttpException i może wpłynąć na wydajność i wypełnić dzienniki zdarzeń.
Ripside
45

To może być późno, ale mam nadzieję, że pomoże to komuś, kto szuka odpowiedzi.

W tym celu możesz skorzystać z następującego wiersza:

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

Staraj się unikać używania, Response.Redirectponieważ zwiększa to liczbę etapów procesu. W rzeczywistości to:

  1. Odsyła stronę z nagłówkiem przekierowania
  2. Przeglądarka przekierowuje do docelowego adresu URL.

Jak widać, ten sam wynik dotyczy 2 podróży, a nie 1 podróży.

dicemaster
źródło
2
+1 za wskazanie, że Server.Transfer () jest bardziej wydajnym sposobem niż Response.Redirect ()
Jenny O'Reilly
To działało w przypadkach, gdy Response.Redirect nie działał poprawnie.
Ed Bayiates
Zauważyłem, że nie usuwa to stanu stron, np. Ustawione .Textw a TextBoxlub .Visiblestatus Button.
Chmura
38

Spróbuj tego:

Response.Redirect(Request.Url.AbsoluteUri);
Andrew Hare
źródło
1
To po prostu wysłać stronę przekierowania zamiast strony, powodując pętlę, która przeglądarka zatrzyma się, gdy widzi, że nigdy nie będzie się prawdziwy stronę ...
Guffa
2
@Guffa, która zależy całkowicie od kontekstu, w którym jest używane przekierowanie. Jeśli jest używany w bloku akcji / kodu, który jest specjalnie wywoływany na podstawie akcji lub warunku, będzie uruchamiany tylko raz na każdą iterację i jeśli zostanie poprawnie zakodowany w izolacji.
Phill Healey
Może to spowodować utratę danych sesji po przekierowaniu. Jest coś w pełni kwalifikowanych adresów URL, które psują sesje.
Chris Cudmore
13

Użyj metody location.reload () z javascript .

<script type="text/javascript">
  function reloadPage()
  {
    window.location.reload()
  }
</script>
jrummell
źródło
8

Istnieją różne metody odświeżania strony w asp.net, takie jak ...

Skrypt Java

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

Kod za

Response.Redirect(Request.RawUrl)

Meta Tag

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

Przekierowanie strony

Response.Redirect("~/default.aspx"); // Or whatever your page url
Sunil Acharya
źródło
6

Jeśli nie chcesz wykonywać pełnego odświeżania strony, to co powiesz na zawijanie tego, co chcesz odświeżyć w UpdatePanel, a następnie wykonanie asynchronicznego ogłaszania zwrotnego?

Bryan Denny
źródło
3

Osobiście muszę upewnić się, że strona zachowuje stan, aby wszystkie pola tekstowe i inne pola wejściowe zachowały swoje wartości. wykonując odświeżanie meta, jest jak nowy wpis, IsPostBack jest zawsze fałszywy, więc wszystkie kontrolki są ponownie w stanie zainicjowanym. Aby zachować stan, umieść to na końcu swojej Page_Load (). utwórz ukryty przycisk na stronie z podłączonym zdarzeniem, coś w rodzaju butRefresh ze zdarzeniem butRefresh_Click (...). Ten kod ustawia licznik czasu na stronie, aby uruchomić ogłaszanie zwrotne, tak jak użytkownik sam kliknął przycisk odświeżania. cały stan i sesja są zachowane. Cieszyć się! (PS, może być konieczne umieszczenie dyrektywy w nagłówku @Page EnableEventValidation = "false", jeśli pojawi się błąd podczas ogłaszania zwrotnego.

//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
źródło
2

Nie możesz tego zrobić. Jeśli używasz przekierowania (lub jakiejkolwiek innej techniki serwera), nigdy nie wyślesz rzeczywistej strony do przeglądarki, a jedynie strony przekierowujące.

Aby to zrobić, musisz użyć metatagu lub JavaScript, aby móc ponownie załadować stronę po jej wyświetleniu przez jakiś czas:

ScriptManager.RegisterStartupScript(this, GetType(), "refresh", "window.setTimeout('window.location.reload(true);',5000);", true);
Guffa
źródło
2

W swoim page_loaddodaj to:

Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.Expires = -1;
sjehutch
źródło
1
Response.Write("<script>window.opener.location.href = window.opener.location.href </script>");
farhana
źródło
1

Możesz skorzystać z 2 sposobów rozwiązania tego problemu: 1) Po tagu head

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

2) Jeśli Twoja strona nie ma tagu head, do zaimplementowania musisz użyć Javascript

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

Mój kontakt:

http://gola.vn

Tomek
źródło
1

Jedynym poprawnym sposobem odświeżenia strony było użycie JavaScript, wiele z najlepszych odpowiedzi .NET zawiodło.

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

Umieść powyższy kod w zdarzeniu kliknięcia przycisku lub w dowolnym miejscu, w którym chcesz wymusić odświeżenie strony.

Hammad Khan
źródło