• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Stand By .NET

.NET & SQL Server
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

第七章 简单属性和视图状态

    简单属性与复杂属性(P102)
        简单属性:值可以很容易地转换为文本型(字符串)表达式的属性,这些属性包括原始类型(如Int32、Boolean和DataTime),还包括一些其他的经常使用的类型(比如字符型和枚举型);
        复杂属性:表现的类型不能简单地表示成单独的字符串,这些属性包括非原始数值类型、除字符串之外的引用类型和集合类型。

    视图状态与状态管理(P102)
        Web应用程序创建于HTTP协议的顶层,这个协议是一个无状态的协议,页面和它的子控件是基于每一个请求而创建的,在请求的最后阶段被删除,而在一个Web请求的持续时间外保持信息常常是必需的。在传统的ASP状态管理编程中,通过Session和Cookies保存状态,但是Session状态不可扩展,Cookies不能被所有的应用程序所依赖。ASP.NET提供了一种新的机制,视图状态(view state),这种机制可以使页面和它的子控件在从服务器到客户端再从客户端返回的往返过程中保持状态信息。本质上,默认的视图状态机制包括了通过页面上一个隐含的变量(__VIEWSTATE)来保持状态信息。

    当页面框架在回传之后重新加载控件时,会自动重新存储一些属性,这些属性在上一次请求的处理过程的最后将它们的状态值存储到ViewState中,当属性被存储到ViewState字典中时,ViewState会在控件初始化之后跟踪属性,只有当属性初始化之后被修改时,ViewState才会在控件的可串行化视图状态中保存属性的值,这个过程最小化了往返过程中数据的大小。

1 public string TextInViewState {
2             get {
3                 object o = ViewState["TextInViewState"];
4                 return (o == null)? String.Empty : (string)o;
5             }
6             set{
7                 ViewState["TextInViewState"] = value;    
8             }
9         }

    视图状态的细节(P106)
    1)视图状态是怎样工作的
        在处理一个Web请求的最后,页面框架会收集控件树中所有控件的状态并且创建一个对象图,每一个控件的ViewState字典是它所保存状态的一部分。页面框架将整个对象图串行化到一个字符串表达式中,这个字符表达式默认地作为隐含变量发送到客户端。
        页面开发者可以通过重载Page类的LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法来改变默认的持久机制,从而在其他地方保持串行化状态,而不是把状态作为一个隐含的域来往返传递。
        当浏览器把页面回传给服务器时,页面框架读回隐含变量并且进行并行化,使得保存的状态可以被重写入控件树中相应的控件中。
        作为重新加载的一部分,ViewState字典自动地被重写入上一次请求最后存储在ViewState中的值。因而,控件的任何一个存储在ViewState字典中的状态都可以自动恢复。
        开发简单控件所有必须要做的事情就是使用ViewState来存储属性的值;
        开发复杂控件,则必须使用ViewState与自定义状态管理(通过执行IStateManager)相结合来存储属性的值。
    2)启用视图状态
        Control类展示了一个EnableViewState的布尔(Boolean)类型的属性,这个属性允许控件的用户指定控件和子控件的视图状态是否应该在一个请求的最后被页面框架串行化。这个属性的默认值为真(true)。
    3)可以在视图状态中存储的类型
        视图状态可以根据一套特定的常用类型的速度和串行化大小进行优化。
        默认支持的类型:Int32、Boolean、String、Unit和Color。
        此外,视图状态还为Array、ArrayList和包含上面列出类型的Hashtable对象而优化。
        当不是上述类型时,这个类型的值就会通过其关联类型转换器(TypeConverter)转换成一个字符串。
        类型转换器(TypeConverter):是一种执行类型转换的类,包括字符串到数值和数值到字符串的转换。
        如果没有发现类型转换器,页面框架将会使用.NET框架提供的二进制串行化功能来串行化数值,这个功能相当昂贵。当在控件中使用视图状态时,应该试着限定于使用那些经过优化的类型,另外,可以在类型转换器中执行一个有效的转换算法使它与类型关联起来。
    4)视图状态与性能
        视图状态可以引起性能开销,视图状态的大小也决定了串行化和并行化视图状态所需要的处理时间。不应该在视图状态中保存计算过的数值。如果有几个依赖公共数据的属性,可以通过在视图状态中保持一个公共数据副本的方法来优化性能。
    5)视图状态与安全
        默认情况下,页面框架还会发送一个视图状态字符串的摘要,如果视图状态在往返期间被篡改,这样做可以允许页面在回传中检查。为了使视图状态更安全,可以选择为页面加密视图状态。
        在视图状态中决不能保存任何信息(如口令、连接字符串和文件路径等),会危害程序的安全性,应该使用私有成员变量来存储这些信息,并且要求页面开发者在每个请求中设置这些信息。
    6)使用Session和Application对象
        有时,控件需要跨用户对话甚至跨应用程序复用数据
        a)用视图状态存储控件需要回传之后恢复状态的数据
        b)Session可以存储需要跨用户浏览器会话的数据,Session对象只存在于服务器上,并为每一个用户会话而创建,所以没有必要为线程的安全担心,然而,应注意允许页面开发者对特定的Web应用程序关闭Session状态特性
        c)Application可以存储需要整个应用程序的数据,它不是线程安全的,因为多个用户可以同时访问页面,应该为线程的安全负责

    简单属性的声明持久性
        ASP.NET的解析程序支持一种声明性的模型,它可以在控件上设置属性,而这些属性是作为控件标签上的attribute。这种模型与自定义控件协同工作。

1 <msp:ViewStateDemoLabel id="demolabel1" runat="server" Font-Names="Verdana" Font-Size="Medium" />

        类型转换器类派生与System.ComponentModel.TypeConverter,它可以从字符串表达式转换成指定的类型,也可以从指定的类型转换成字符串表达式。
        通常使用的类型都有.NET框架中相应的类型转换器,Int32-System.ComponentModel.Int32Converter、Boolean-System.ComponentModel.BooleanConverter、枚举类型-System.ComponentModel.EnumConverter。
        当定义一个类型与一个公共的内建的类型相符合的属性时,没有必要为这个属性启用声明性语法而做任何特殊的事情。
        为了在定义自定义类型的属性时可以使用声明持久性,必须执行一个自定义类型转换器,这个转换器提供了一段程序逻辑,可以把属性从文本表达式转换成所声明的类型。

    对照Control类的公共属性(P109),测试控件为Button控件,ID为btnTest

ClientID:btnTest
ID:btnTest
NamingContainer:ASP.WebForm1_aspx
Parent:System.Web.UI.HtmlControls.HtmlForm
UniqueID:btnTest

    属性的设计期attribute
        为属性应用设计期attribute的核心集可以增强控件的设计期行为,设计期attribute只能用于公用属性,非公用属性在设计器中始终是不可见的。
        默认情况下公用属性总是在属性浏览器中显示,应该把那些只读的属性标记为Browsable(false)。

    重载attribute
        示例:禁止显示BackColor属性

 1 [
 2 Browsable(false),
 3 Description("The background color")
 4 ]
 5 public override Color BackColor {
 6     get {
 7         object o = ViewState["BackColor"];
 8         return (o == null) ? Color.Empty : (Color)o;
 9     }
10     set {
11         ViewState["BackColor"] = value;
12     }
13 }

    综合示例--PageTracker示例
        ·Page.GetType().FullName == ASP.WebForm1_aspx,此页面文件名为WebForm1.aspx
        ·lock关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
            此语句的形式:lock(expression) statement_block          
            expression 
                指定要锁定的对象。expression 必须是引用类型。
                通常,如果要保护实例变量,则 expression 为 this;如果要保护 static 变量(或者如果临界区出现在给定类的静态方法中),则 expression 为 typeOf (class)。
            statement_block 
                临界区的语句。
            lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入一个锁定代码,则它将在释放该对象前一直等待(块)。
        ·为何在设计期ByApplication、BySession和ByTripTime呈现不同的设计期模板?
            因为Application、Session只有在运行期才有效,所以TripTime可以在运行期取到0值而呈现设计期状态,而Application和Session因为无法获取值只能显示默认设计期状态。

posted on 2006-01-06 15:22  .............  阅读(162)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3