Tuesday 29 October 2013

Getting the client browser's date and time with ASP.NET


In order to provide relevant content to a site visitor, I wanted to find out what time of day it was wherever the visitor was located.  This would be useful to serve different content based on if its morning ("Buy Coffee!!"), lunch ("Eat lunch near you!!"), or evening ("Come rent a movie from us!!")
Using a similar approach to how viewstate is maintained during postbacks, I added a couple of methods to my base page implementation and a read-only property which returns the value of hidden input.  When the base page's load method fires, it registers a hidden input and a small script that will set the input's value equal to the date of the client browser during a postback.
public class ClientTimeBasePage : Page
{

    private const string CLIENTTIME_SCRIPT_ID = "__CLIENTTIMEJS";
    private const string CLIENTTIME_FIELD = "__CLIENTTIME";

    public string ClientTime
    {
        get { return this.Request.Form[CLIENTTIME_FIELD]; }
    }

    protected override void OnLoad(EventArgs e)
    {

        ClientScript.RegisterHiddenField(CLIENTTIME_FIELD, "");
        if(!ClientScript.IsOnSubmitStatementRegistered(typeof(string), CLIENTTIME_SCRIPT_ID))
        {
            ClientScript.RegisterOnSubmitStatement(typeof(string), CLIENTTIME_SCRIPT_ID, "document.getElementById('" + CLIENTTIME_FIELD + "').value=new Date();");

        }  
        base.OnLoad(e);

    }
}
At this point, I should mention I have not tested this thoroughly but I'm pretty sure I'll run into problems when we get into different culture and locale settings across browsers.  A few other considerations that come to mind is using AJAX for a similar implementation and possibly attaching the client date / time to the Request context.  This seems like a more appropriate place for it - perhaps using extension methods in C# 3.0.  Another option is to write some more intricate javascript to perform a little more parsing on the client-side.  We should always be careful when we rely on the client's browser for input data.

No comments:

Post a Comment