Permalänk

[ASP.NET C#] Caching

Tjo,

Detta tycks vara ett ganska vanligt problem och jag har grävt i timmar utan att hitta nån faktisk lösning.

Låt säga att jag har 2 sidor, pageA och pageB. På pageA har jag ett antal checkboxar och en label.
Användaren klickar i önskade checkboxar och antalet ikryssade visas i labeln. Därefter klickar användaren sig vidare till pageB (Server.Transfer("~/pageB.aspx", true);) som visar ett resultat baserat på inmatning från pageA.

Sedan trycker användaren på _browserns_ back button och då uppstår problemet att checkboxarna är fortfarande ikryssade men labeln står på ditt default-värde (0) eftersom sidan är cachad och jag får ingen notifiering i Page_load eller annanstans där jag kan återställa inmatningen eller läsa av sessionsvariabler och annat.

Frågan är helt enkelt hur jag kan få pageA att bli refreshed/återställd då användaren klickar tillbaka till den via browserns back button från pageB?

Stänger man av cachningen för pageA så visas "Page has expired"-sidan, vilket jag inte vill.

Tack!

Visa signatur

Min dator är bättre än din.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Tungviktarn
Tjo,

Detta tycks vara ett ganska vanligt problem och jag har grävt i timmar utan att hitta nån faktisk lösning.

Låt säga att jag har 2 sidor, pageA och pageB. På pageA har jag ett antal checkboxar och en label.
Användaren klickar i önskade checkboxar och antalet ikryssade visas i labeln. Därefter klickar användaren sig vidare till pageB (Server.Transfer("~/pageB.aspx", true);) som visar ett resultat baserat på inmatning från pageA.

Sedan trycker användaren på _browserns_ back button och då uppstår problemet att checkboxarna är fortfarande ikryssade men labeln står på ditt default-värde (0) eftersom sidan är cachad och jag får ingen notifiering i Page_load eller annanstans där jag kan återställa inmatningen eller läsa av sessionsvariabler och annat.

Frågan är helt enkelt hur jag kan få pageA att bli refreshed/återställd då användaren klickar tillbaka till den via browserns back button från pageB?

Stänger man av cachningen för pageA så visas "Page has expired"-sidan, vilket jag inte vill.

Tack!

En "back" i en browser laddar från browserns cache. Det är därför du inte kan hantera det där.

Det går att lösa exempelvis genom att lägga på en pragma:

<meta http-equiv="pragma" content="no-cache"/>

Kanske finns det något sätt i ASP.net för att lägga till det där utan att mecka i markup-code. Men det lämnar jag över åt google.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

Att göra så att pageA blir expired är inga problem, men det vill jag inte. Jag vill att pageA automatiskt ska refreshas eller att "originalsidan" visas när man trycker browser back från pageB.

Visa signatur

Min dator är bättre än din.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Tungviktarn
Att göra så att pageA blir expired är inga problem, men det vill jag inte. Jag vill att pageA automatiskt ska refreshas eller att "originalsidan" visas när man trycker browser back från pageB.

Läs vad som skrivs. Trycker användare på "back" så använder browsern sin cache för sidan ifråga. Om inte annat angetts i sidans kod.

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Permalänk
Citat:

Ursprungligen inskrivet av BlueEyes
Läs vad som skrivs. Trycker användare på "back" så använder browsern sin cache för sidan ifråga. Om inte annat angetts i sidans kod.

Givetvis har jag testat det Leedow föreslog och jag svarade på det i posten ovan. Vad som händer är att sidan blir expired, vilket jag inte vill.

EDIT:
Har hittat en lösning som är helt OK.

Lade till en dold variabel på pageA:

<input type="hidden" id="refreshed" value="no" />

samt ett litet JavaScript:

protected override void OnPreRender(EventArgs e) { StringBuilder javaScript = new StringBuilder(); //javaScript.Append("\n<script language=JavaScript>\n"); //javaScript.Append("window.history.forward(1);\n"); //javaScript.Append("</script>\n"); javaScript.Append("<script type=text/javascript language=javascript>"); javaScript.Append("onload=function(){"); javaScript.Append("var e=document.getElementById('refreshed');"); javaScript.Append(" if(e.value=='no')e.value='yes';"); javaScript.Append(" else{e.value='no';location.reload();}"); javaScript.Append(" }</script>"); ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "HistoryScript", javaScript.ToString()); base.OnPreRender(e); }

Det enda som stör lite är dialogen som browsern poppar upp när man går från pageB till pageA.

Effekten är dock precis den jag vill uppnå.

Visa signatur

Min dator är bättre än din.