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.


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.


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.


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.


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);

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


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

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?


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>");

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);

2

W swoim page_loaddodaj to:

Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.Expires = -1;

1
Response.Write("<script>window.opener.location.href = window.opener.location.href </script>");

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.