现在的位置: 首页 > 综合 > 正文

服务器控件-PageTracking-解读笔记(10)

2013年03月11日 ⁄ 综合 ⁄ 共 5101字 ⁄ 字号 评论关闭

参考http://www.cnblogs.com/bluewater/archive/2006/08/08/470093.html

PageTracker,用来跟踪页面会话状态和程序状态收到的点击数目,并计算页面往返时间

跟踪方式:

 public enum PageTrackingMode
    {
        ByApplicaion,
        BySession,
        ByTripTime
    }

 1.引用命名空间 

using System;

using System.ComponentModel;

System.ComponentModel 命名空间提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。

using System.Web.UI;

System.Web.UI 命名空间提供的类和接口使您得以创建将作为用户界面元素出现在您的 Web 应用程序中的 ASP.NET 服务器控件和页。

http://msdn.microsoft.com/zh-cn/library/system.web.ui(VS.80).aspx

using System.Web.UI.WebControls;

System.Web.UI.WebControls 命名空间包含一些类,可使用这些类在网页上创建 Web 服务器控件。Web 服务器控件运行在服务器上并且包括按钮和文本框等窗体控件。它们还包括具有特殊用途的控件(如日历)。由于 Web 服务器控件运行在服务器上,因此可以以编程方式控制这些元素。尽管 Web 服务器控件呈现为 HTML,但它们的对象模型不一定反映 HTML 语法。

System.Web.UI.WebControls 命名空间包含一些呈现为 HTML 标记的类,如 TextBox 控件和 ListBox 控件。该命名空间还包含一些不在网页上呈现、但支持数据操作的类,如 SqlDataSource 类和 ObjectDataSource 类。其他一些控件(如 GridView 控件和 DetailsView 控件)支持数据显示和编辑。WebControl 类用作 System.Web.UI.WebControls 命名空间中许多类的基类。

//http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols(VS.80).aspx

2.TrackingMode属性定义

关于属性的内容,可参考:http://msdn.microsoft.com/zh-cn/library/system.componentmodel(VS.80).aspx

 

[
      DefaultProperty("TrackingMode"),     //指定组件的默认属性
  ]
  public class PageTracker : WebControl    //继承自"WebControl" 
  {
      private TimeSpan _tripTime;
      [
      Category("Appearance"),  //与实体的外观相关的属性            
      DefaultValue("{0}"),     //指定属性 (Property) 的默认值。
      Description("The formatting string used to display the " +
          "value being tracked.") //指定属性 (Property) 或事件的说明。
      ]
//暴露FormatString属性(读写)  虚拟可重载,公用属性
      public virtual string FormatString //虚方法,可重写.格式化字符串
      {
          get
          {
              string s = (string)ViewState["FormatString"]; //从viewstate取
              return ((s == null) ? "{0}" : s);
          }
          set    
          {
              ViewState["FormatString"] = value;//使FormatString属性可以设置.
          }
      }

3.Hits

[ 
        Browsable(false),//指定一个属性 (Property) 或事件是否应显示在“属性”窗口中。只读属性 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)

//指定在设计时序列化组件上的属性 (Property) 时所使用的持久性类型。

//当序列化程序保持设计模式文档的可持续状态时,它通常会向组件的初始化方法中添加代码,以便保持已在设计时设置的属性 (Property) 值。

// Hidden 不应在初始化代码中保持, Visible 而应在初始化代码中保持
 
       ]
//暴露Hits属性(只读)非虚拟,公用属性
        public int Hits 
        { 
            get 
            { 
                PageTrackingMode mode = TrackingMode;//取属性TrackingMode的值 
                object o = null; 
                if (mode == PageTrackingMode.ByApplicaion) //如果属性为byapplication 
                { 
                    o = Page.Application[HitsKey]; 
                } 
                else if (mode == PageTrackingMode.BySession)//如果属性为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); //返回属性值 
            } 
        }

 

4.虚方法 behavior的set和get 

      
        [ 
        Category("Behavior"), //行为 
        DefaultValue(PageTrackingMode.ByApplicaion), //属性默认值为byapplication 
        Description("The type of tracking to perform.") //category描述 
        ] 
//暴露TrackingMode属性(读写) 虚拟可重载,公用属性
        public virtual PageTrackingMode TrackingMode //定义虚方法, 返回值为枚举类型 
        { 
            get 
            { 
                object mode = ViewState["TrackingMode"];//从viewstate取得属性值 
                return ((mode == null) ? PageTrackingMode.ByApplicaion : (PageTrackingMode)mode); 
              //属性值为"空",则使用application存储,如果不为空,则返回从viewstate取得的属性值 
            } 
            set //设定属性值 
            { 
                if (value < PageTrackingMode.ByApplicaion || 
                    value > PageTrackingMode.ByTripTime) 
                { 
                    throw new ArgumentOutOfRangeException("value"); 
                } 
                ViewState["TrackingMode"] = value; 

                //执行清空旧存储
                //我们需要检查page非空
                //因为控件在加入控件树之前旧可能被初始化了.
                //注意:Application和Session对象在设计视图中不可用,所以会出异常
                switch (TrackingMode) 
                { 
                    case PageTrackingMode.ByApplicaion://如果使用application 
                        if (Page != null && Page.Application != null) //如果page和page.application不为空 
                        { 
                            Page.Application.Remove(HitsKey);//移除名为hitskey的application 
                        } 
                        break; 
                    case PageTrackingMode.BySession://如果使用session 
                        if (Page != null && Page.Session != null) 
                        { 
                            Page.Session.Remove(HitsKey);//则移除名为hitskey的session 
                        } 
                        break; 
                    case PageTrackingMode.ByTripTime://如果使用viewstate 
                        ViewState.Remove("TimeStamp");//则移除名为timestamp的viewstate 
                        break; 
                } 
            } 
        }

5.TripTime,TagKey,HitsKey属性,都是不显示在属性窗口中的.无持久性的属性
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)//只读属性
        ]
//暴露TripTime属性(只读)非虚拟,公用属性
        public TimeSpan TripTime
        {
            get
            {
                if (TrackingMode != PageTrackingMode.ByTripTime) {
                    throw new NotSupportedException("TripTime is " +
                        "only supported when TrackingMode is " +
                        "PageTrackingMode.ByTripTime ");
                }
                return _tripTime;
            }
        }
//http://msdn.microsoft.com/zh-cn/library/system.web.ui.htmltextwritertag(VS.80).aspx
        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Div;
            }
        }
        private string HitsKey {
            get
            {
                //Create a unique HitsKey for the page for keying in 
                //hits per page in the Application an Session objects
                //每点击一下页面上的按钮...
                return Page.GetType().FullName;
            }
        }
//更新Hits和TripTime属性的状态
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            switch (TrackingMode)
            {
                case PageTrackingMode.ByApplicaion:
                    lock (Page.GetType())
                    {
                        //因为应用程序可以同时被多个访问者访问,所以lock
                        Page.Application[HitsKey] = Hits + 1;
                    }
                    break;
                case PageTrackingMode.BySession:
                    Page.Session[HitsKey] = Hits + 1;
                    break;
                case PageTrackingMode.ByTripTime:
                    object timeStamp = ViewState["TimeStamp"];//取得前一次请求的时间
                    //(存储在"viewstate"中的时间)
                    DateTime requestTime = Context.Timestamp;//取得服务器时间
                    if (timeStamp == null)
                    {
                        _tripTime = TimeSpan.Zero;
                        this.Visible = false;
                    }
                    else
                    {
                        this.Visible = true;
                        _tripTime = (requestTime - (DateTime)timeStamp);//往返时间
                    }
                    ViewState["TimeStamp"] = requestTime;//设置viewstate["timestamp"]为服务器时间
                    break;
            }
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            switch (TrackingMode)
            {
                case PageTrackingMode.ByApplicaion:
                case PageTrackingMode.BySession:
                    writer.Write(FormatString, Hits);
                    break;
                case PageTrackingMode.ByTripTime:
                    writer.Write(FormatString, TripTime.TotalSeconds);
                    break;
            }
        }

抱歉!评论已关闭.