自空义控件的有关问题
自空义控件的问题
- 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; } } } }