技术开发 频道

ASP.NET服务器控件之视图状态

    · 加密机制

    使用加密来保护ViewState字段中的实际数据值。首先,必须如上所述设置EnableViewStatMAC="true"。然后,将machineKey validation类型设置为3DES,即<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="3DES" />,这指示ASP.NET使用3DES加密算法来加密ViewState值。

    (4)视图状态分块

    以上内容介绍了视图状态的一些基本知识。然而,可能部分读者会有些疑惑:如果在某些情况下,视图状态数据变得很大,那怎么办呢?这样显然会出现一些意想不到的后果。为此,ASP.NET 2.0新增了一种名为"视图状态分块"的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。

    若要启用视图状态分块,可将MaxPageStateFieldLength属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区。

    (5)优点和缺点

    使用视图状态具有以下3个优点:一、耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。二、易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。三、增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。

    使用视图状态具有以下3个缺点:一、性能注意事项。由于视图状态存储在页本身,因此如果存储较大的值,即使在视图状态分块的情况下,用户显示页和发送页时的速度仍然可能减慢。二、设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,移动设备上的服务器控件时,将使用其他的实现方法。三、潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。

    典型应用

    在利用ASP.NET 2.0技术进行服务器控件开发过程中,有很多方面可以用到视图状态。常见的是利用ViewState字典实现服务器控件属性。ViewState是System.Web.UI.StateBag类型-一个键/值对的字典,服务器控件的属性值可以存储在ViewState中。下面通过一个典型示例,说明ViewState的应用方法。

    在自定义服务器控件LabelInViewState中,实现了两个属性Text和TextInViewState。前者使用私有变量创建,后者使用ViewState实现。它们都用于获取或者设置文本内容。自定义控件实现文件LabelInViewState.cs源代码如下所示。
using System;using System.Collections.Generic; using System.ComponentModel;using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;namespace WebControlLibrary{  [DefaultProperty("Text")]  [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")]  public class LabelInViewState : WebControl {   private string _text; //实现Text属性   public string Text {    get {     return (_text == null) ? string.Empty : _text;    }    set { _text = value; }   }   //使用ViewState实现TextInViewState属性   public string TextInViewState {    get {     String s = (String)ViewState["TextInViewState"];     return ((s == null) ? String.Empty : s);    }    set { ViewState["TextInViewState"] = value; }   }   // 重写RenderContents方法   protected override void RenderContents(HtmlTextWriter output) {    output.Write("Text = ");    output.Write(Text);    output.Write("<br/>");    output.Write("TextInViewState = ");    output.Write(TextInViewState);   }  } }
0
相关文章