自空义控件的有关问题

自空义控件的问题
C# code

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MSPress.ServerControl
{
    public enum PageTrackingMode
    {
        ByApplication,
        BySession,
        ByTripTime
    }
    [DefaultProperty("TrackingMode")]

    public class PageTracker : WebControl
    {
        private TimeSpan _tripTime;

        [Category("Appearance")]
        [DefaultValue("{0}")]
        [Description("The formatting string use to display value being tracked.")]
        public virtual string FormatString
        {
            get
            {
                string s = (string)ViewState["FormatString"];
                return ((s == null) ? "{0}" : s);
            }
            set
            {
                ViewState["FormatString"] = value;
            }
        }

        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public int Hits
        {
            get
            {
                PageTrackingMode mode = TrackingMode;
                object o = null;
                if (mode == PageTrackingMode.ByApplication)
                {
                    o = Page.Application[HitsKey];
                }
                else if (mode == PageTrackingMode.BySession)
                {
                    o = Page.Session[HitsKey];
                }
                else
                {
                    throw new NotSupportedException("Hits is only supported when TrackingMode is PageTrackingMode.ByApplication or PageTrackingMode.BySession");
                }
                return ((o == null) ? 0 : (int)o);
            }
        }

        [Category("Behavior")]
        [DefaultValue(PageTrackingMode.ByApplication)]
        [Description("Thy type of tracking to perform.")]
        public virtual PageTrackingMode TrackingMode
        {
            get
            {
                object mode = ViewState["TrackingMode"];
                return ((mode == null) ? PageTrackingMode.ByApplication : (PageTrackingMode)mode);
            }
            set
            {
                if (value < PageTrackingMode.ByApplication || value > PageTrackingMode.ByTripTime)
                {
                    throw new ArgumentOutOfRangeException("value");
                }
                ViewState["TrackingMode"] = value;
                switch (TrackingMode)
                {
                    case PageTrackingMode.ByApplication:
                        if (Page != null && Page.Application != null)
                        {
                            Page.Application.Remove(HitsKey);
                        }
                        break;
                    case PageTrackingMode.BySession:
                        if (Page != null && Page.Session != null)
                        {
                            Page.Session.Remove(HitsKey);
                        }
                        break;
                    case PageTrackingMode.ByTripTime:
                        ViewState.Remove("TimeStamp");
                        break;
                }
            }
        }

        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public TimeSpan TripTime
        {
            get
            {
                if (TrackingMode != PageTrackingMode.ByTripTime)
                {
                    throw new NotSupportedException("TripTime is only supported when TrackingMode is PageTrackingMode.ByTripTime");
                }
                return _tripTime;
            }
        }

        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Div;
            }
        }

        private string HitsKey
        {
            get
            {
                return Page.GetType().FullName;
            }
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            switch (TrackingMode)
            {
                case PageTrackingMode.ByApplication:
                    lock (Page.GetType())
                    {
                        Page.Application[HitsKey] = Hits + 1;
                    }
                    break;

                case PageTrackingMode.BySession:
                    Page.Session[HitsKey] = Hits + 1;
                    break;

                case PageTrackingMode.ByTripTime:
                    object timeStamp = ViewState["TimeStamp"];
                    DateTime requestTime = Context.Timestamp;
                    if (timeStamp == null)
                    {
                        _tripTime = TimeSpan.Zero;
                        this.Visible = false;
                    }
                    else
                    {
                        this.Visible = true;
                        _tripTime = (requestTime - (DateTime)timeStamp);
                    }
                    ViewState["Timestamp"] = requestTime;
                    break;
            }
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            switch (TrackingMode)
            {
                case PageTrackingMode.ByApplication:
                case PageTrackingMode.BySession:
                    writer.Write(FormatString, Hits);
                    break;
                case PageTrackingMode.ByTripTime:
                    writer.Write(FormatString, TripTime.TotalSeconds);
                    break;
            }
        }
    }

}