Hoi,
Ik werk aan een website met een pagina die data uit een database leest en die daarna toont in een Repeater control. De data bevat twee tijd velden (start en eindtijd) die in UTC zijn opgeslagen. In de Repeater toon ik momenteel de start, eind en totale tijd via deze code:
Wat hier relevant is is dat de data dus in de Repeater geladen wordt in het Page_Load event, zodat de data meteen getoond wordt bij het openen van de pagina.
Nu wil ik graag deze tijden omrekenen naar de lokale tijd van de gebruiker, zodat ik (naast UTC) ook de lokale tijd kan laten zien (ik ga er dan maar even vanuit dat de PC op de lokale tijd ingesteld staat, meer kan ik niet doen natuurlijk). Nu weet ik dat ik via Javascript het aantal minuten kan opvragen die de gebruiker verschilt met UTC, via Date.getTimezoneOffset(). Het probleem is dat dit dus met Javascript is, en ik dat niet meteen aan de server kant krijg.
De oplossing die ik overal vind is om de timezone offset op te vragen bij de document.load / window.load in Javascript, en die waarde toe te kennen aan een HiddenField op de pagina. Dan zou ik aan de serverkant de waarde weer kunnen uitlezen en gebruiken. Deze methode ben ik bekend mee, echter werkt het in dit geval niet. Het probleem is misschien al duidelijk: de data wordt in de Repeater gezet tijdens het renderen van de pagina, dus nog voordat de pagina naar de client gaat. De HiddenField waarde wordt dus pas gezet als de pagina bij de client is, en op dat moment is het al te laat, de data had ik al moeten hebben. De HiddenField blijft dan natuurlijk ook leeg totdat de pagina geladen is.
Hoe kan ik de timezone offset opvragen zodat ik die in de Page_Load beschikbaar heb? Volgens mij is dat onmogelijk, niet? De timezone kan ik alleen van de client krijgen, echter heeft de pagina nog niks met de client te doen in de Page_Load, die komt natuurlijk voordat de pagina naar de client gaat... Klopt dat, of mis ik hier iets?
Een soort van oplossing die ik kan zien is door een postback te genereren in de Javascript code nadat de HiddenField waarde gezet is. De data wordt dan enkel geladen en in de Repeater gezet als de HiddenField waarde niet leeg is. Het resultaat zou dan zijn (denk ik) dat de pagina laadt zonder data, dan wordt de HiddenField gezet, en daarna laadt de pagina opnieuw en kan ik de HiddenField waarde gebruiken in de Page_Load. Op dat moment is het dus een postback, daar zou ik dan rekening mee moeten houden (momenteel laadt ik de data niet meer opnieuw in de Repeater bij een postback).
Maar dit vind ik een bijzonder nare oplossing, vooral omdat het voor de gebruiker zichtbaar is dat de pagina twee keer laadt.
Is er geen betere oplossing om de timezone offset te krijgen en die meteen te kunnen gebruiken bij het laden van de pagina?
Bedankt!
Ik werk aan een website met een pagina die data uit een database leest en die daarna toont in een Repeater control. De data bevat twee tijd velden (start en eindtijd) die in UTC zijn opgeslagen. In de Repeater toon ik momenteel de start, eind en totale tijd via deze code:
ASP:
1
2
3
4
5
6
7
| <asp:Repeater runat="server" ID="repeater"> <ItemTemplate> <div> Time: <%# GetTimeDisplay(Container.DataItem) %> </div> </ItemTemplate> </asp:Repeater> |
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| public class TestPage : ChildPage { private readonly List<Session> sessions; protected void Page_Load(object sender, EventArgs e) { sessions = Database.LoadSessions(); if (!this.IsPostBack) { repeater.DataSource = sessions; repeater.DataBind(); } } protected string GetTimeDisplay(object sessionObject) { Session session = (Session) sessionObject; int minutes = (int)(session.EndTime - session.StartTime).TotalMinutes; return string.Format("{0} - {1} ({2} min)", session.StartTime.ToString(@"hh\:mm"), session.EndTime.ToString(@"hh\:mm"), minutes.ToString()); } } |
Wat hier relevant is is dat de data dus in de Repeater geladen wordt in het Page_Load event, zodat de data meteen getoond wordt bij het openen van de pagina.
Nu wil ik graag deze tijden omrekenen naar de lokale tijd van de gebruiker, zodat ik (naast UTC) ook de lokale tijd kan laten zien (ik ga er dan maar even vanuit dat de PC op de lokale tijd ingesteld staat, meer kan ik niet doen natuurlijk). Nu weet ik dat ik via Javascript het aantal minuten kan opvragen die de gebruiker verschilt met UTC, via Date.getTimezoneOffset(). Het probleem is dat dit dus met Javascript is, en ik dat niet meteen aan de server kant krijg.
De oplossing die ik overal vind is om de timezone offset op te vragen bij de document.load / window.load in Javascript, en die waarde toe te kennen aan een HiddenField op de pagina. Dan zou ik aan de serverkant de waarde weer kunnen uitlezen en gebruiken. Deze methode ben ik bekend mee, echter werkt het in dit geval niet. Het probleem is misschien al duidelijk: de data wordt in de Repeater gezet tijdens het renderen van de pagina, dus nog voordat de pagina naar de client gaat. De HiddenField waarde wordt dus pas gezet als de pagina bij de client is, en op dat moment is het al te laat, de data had ik al moeten hebben. De HiddenField blijft dan natuurlijk ook leeg totdat de pagina geladen is.
Hoe kan ik de timezone offset opvragen zodat ik die in de Page_Load beschikbaar heb? Volgens mij is dat onmogelijk, niet? De timezone kan ik alleen van de client krijgen, echter heeft de pagina nog niks met de client te doen in de Page_Load, die komt natuurlijk voordat de pagina naar de client gaat... Klopt dat, of mis ik hier iets?
Een soort van oplossing die ik kan zien is door een postback te genereren in de Javascript code nadat de HiddenField waarde gezet is. De data wordt dan enkel geladen en in de Repeater gezet als de HiddenField waarde niet leeg is. Het resultaat zou dan zijn (denk ik) dat de pagina laadt zonder data, dan wordt de HiddenField gezet, en daarna laadt de pagina opnieuw en kan ik de HiddenField waarde gebruiken in de Page_Load. Op dat moment is het dus een postback, daar zou ik dan rekening mee moeten houden (momenteel laadt ik de data niet meer opnieuw in de Repeater bij een postback).
Maar dit vind ik een bijzonder nare oplossing, vooral omdat het voor de gebruiker zichtbaar is dat de pagina twee keer laadt.
Is er geen betere oplossing om de timezone offset te krijgen en die meteen te kunnen gebruiken bij het laden van de pagina?
Bedankt!