Click here to Skip to main content
15,885,537 members
Articles / Web Development / ASP.NET

Manage ViewState Using ASP.NET 2.0 Provider Architecture

Rate me:
Please Sign up or sign in to vote.
3.93/5 (5 votes)
5 Jun 2007CPOL7 min read 78.2K   752   49  
Serverside ViewState management using custom providers based on ASP.NET 2.0 provider pattern architecture.
using System;
using System.ComponentModel;
using System.Web.UI;
using ASP = System.Web.UI.WebControls;

namespace Anthem
{
    /// <summary>
    /// Creates an updatable timer control.
    /// </summary>
    public class Timer : Control //, IUpdatableControl
    {
        #region Declarations

        // Tracks whether the client timeout script should be added to the page.
        private bool _addTimeoutScript = false;

        #endregion

        #region Unique Anthem control code

        /// <summary>
        /// True if the timer is enabled on the client. The timer will continue to call the
        /// DoTick method while it is enabled.
        /// </summary>
        [DefaultValue(false)]
        public bool Enabled
        {
            get
            {
                if (null == ViewState["Enabled"])
                    return false;
                else
                    return (bool)ViewState["Enabled"];
            }
            set
            {
                ViewState["Enabled"] = value;
            }
        }

        /// <summary>
        /// The number of milliseconds between each call to DoTick.
        /// </summary>
        [DefaultValue(1000)]
        public int Interval
        {
            get
            {
                if (null == ViewState["Interval"])
                    return 1000;
                else
                    return (int)ViewState["Interval"];
            }
            set { ViewState["Interval"] = value; }
        }

        /// <summary>
        /// This method is called by the Timer control each time the timer expires.
        /// </summary>
        [Anthem.Method]
        public void DoTick()
        {
            OnTick(EventArgs.Empty);
        }

        /// <summary>
        /// Starts the timer.
        /// </summary>
        public void StartTimer()
        {
            this.Enabled = true;
            _addTimeoutScript = true;
        }

        /// <summary>
        /// Stops the timer.
        /// </summary>
        public void StopTimer()
        {
            this.Enabled = false;
            _addTimeoutScript = true;
        }

        /// <summary>
        /// Occurs when the timer expires.
        /// </summary>
        public event EventHandler Tick;

        /// <summary>
        /// Raises the <see cref="Tick"/> event.
        /// </summary>
        protected virtual void OnTick(EventArgs e)
        {
            if (Enabled && (Tick != null))
            {
                _addTimeoutScript = true;
                Tick(this, e);
            }
        }

        /// <summary>
        /// Registers the client side script for the control.
        /// </summary>
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            if (!Anthem.Manager.IsCallBack)
            {
                // Always register the var that will track the timer.
                string script = string.Format("<script type=\"text/javascript\">var {0}_timer = null;</script>", this.ClientID);
#if V2
                Page.ClientScript.RegisterStartupScript(this.GetType(), script, script, false);
#else
                Page.RegisterStartupScript(script, script);
#endif

                // For the initial page load, register the timer script so that it loads after
                // the page is finished loading.
                if (Enabled)
                {
                    script = string.Format("<script type=\"text/javascript\">{0}</script>", GetSetTimeoutScript());
#if V2
                    Page.ClientScript.RegisterStartupScript(this.GetType(), script, script, false);
#else
                    Page.RegisterStartupScript(script, script);
#endif
                }
            }
            else if (_addTimeoutScript)
            {
                // If this is a callback, add a script to call the timer again or to stop the timer.
                if (Enabled)
                {
                    Anthem.Manager.AddScriptForClientSideEval(GetSetTimeoutScript());
                }
                else
                {
                    Anthem.Manager.AddScriptForClientSideEval(GetClearTimeoutScript());
                }

            }
        }
        
        /// <summary>
        /// Visible is inherited from Control, but ignored by Timer.
        /// </summary>
        [Browsable(false)]
        public override bool Visible
        {
            get { return true; }
            set {}
        }

        #endregion

        #region Common Anthem control code

        // Note that the Timer control only needs to register. Since it is not
        // rendered in the traditional sense, the other common code is not needed.

        /// <summary>
        /// Raises the <see cref="System.Web.UI.Control.Load"/> event and registers the control
        /// with <see cref="Anthem.Manager"/>.
        /// </summary>
        /// <param name="e">A <see cref="System.EventArgs"/>.</param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Anthem.Manager.Register(this);
        }

        #endregion

        #region Private Methods

        private string GetSetTimeoutScript()
        {
            return string.Format("{0} {1}_timer = setTimeout(function() {{ Anthem_InvokeControlMethod('{1}', 'DoTick', [], function() {{ }}, null) }}, {2})",
                GetClearTimeoutScript(),
                ClientID,
                Interval
            );
        }

        private string GetClearTimeoutScript()
        {
            return string.Format("if (typeof({0}_timer) != 'undefined' && {0}_timer != null) {{ clearTimeout({0}_timer); {0}_timer = null; }}", ClientID);
        }

        #endregion
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
Oleg Sobol has been developing web applications in ASP.NET using VB.NET for the past three years. Currently working for a leading online higher education provider, developing new online initiatives and supporting multiple education platforms.

Comments and Discussions