首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网页制作-> Javascript教程
asp.net服务器控件之视图状态_asp.net技巧
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

  为Web页面及其控件保持状态信息是非常有必要的。然而,由于Web应用程序创建于HTTP协议的顶层,这是一个无状态的协议,因此,保持状态信息则变得非常困难。为了解决这个问题,ASP.NET 2.0技术提供了多种解决方案,例如,利用Session、Cookie、视图状态、控件状态、隐藏域、查询字符串、个性化用户配置(Profile)等等。对于利用ASP.NET 2.0技术创建服务器控件而言,保持状态信息也是非常重要的,其主要解决途径是利用视图状态和控件状态。本文详细讲解了视图状态(ViewState)的基本知识,并通过典型应用介绍视图状态的应用方法。

  视图状态概述

  视图状态是一项非常重要的技术,它能使得页面和页面中的控件在从服务器到客户端,再从客户端返回的往返过程中保持状态信息。这样就可以在Web这种无状态的环境之上创建一个有状态并持续执行的页面效果。本节主要介绍有关视图状态的运行机制、应用方法、存储的数据类型、性能和安全性、视图状态分块(这是ASP.NET 2.0的新特性)和优缺点等内容。

  (1)运行机制

  视图状态的具体运行过程为:每当用户请求某个.aspx页面时,.NET框架首先把相关控件的状态数据序列化成一个字符串,然后,将其做为名为__VIEWSTATE的隐藏域的Value值发送到客户端。如果页面是第一次被请求,那么服务器控件也将是被第一次执行时,名为__VIEWSTATE的隐藏域中只包含控件的默认信息,通常为空或者null。在随后的回送事件中,ViewState中就保存了服务器控件在前面回送中可用的属性状态。这样服务器控件就可以监视在当前被处理的回送事件发生之前的状态了。这些过程是由.NET框架负责的,对用户来说是执行.aspx页面就有了持续执行的效果。

  (2)存储的数据类型

  视图状态可以存储多种类型的数据,并且为了提高运行效率,视图状态自身还包括一套已经优化的针对常用类型的序列化方式。视图状态序列化方式默认支持的数据类型包括以下几种:String、Int32、Unit、Color、Array、ArrayList、HashTable和自定义类型转换器TypeConverter。

  视图状态已经为Array、ArrayList和包含上面列出类型的HashTable对象进行了优化。因此,当在控件中使用视图状态时,应该试着限定于使用以上简单数据类型,以及经过优化的类型。在此,需要重点说明一下自定义类型转换器TypeConverter,它提供了一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法。例如,可以利用TypeConverter将字符串转换为数值,或者将数值转换为字符串。如果没有类型转换器,那么页面框架会使用.NET框架提供的二进制序列化功能来序列化对象,这个过程是非常耗费资源的。

  (3)性能和安全性

  使用视图状态时,对象必须先序列化,然后再通过回传进行反序列化。因此,我们必须了解有关ViewState性能的内容。默认情况下,控件的ViewState将被启用,如果不需要使用ViewState,最好还是将它关闭。以下情况将不再需要ViewState:(1)控件未定义服务器端事件(这时的控件事件均为客户端事件且不参加回送的);(2)控件没有动态的或数据绑定的属性值。关闭视图状态的方法是将控件的EnableViewState的值设置为"false",即EnableViewState="false"。

  默认情况下,视图状态的有关内容在编译运行发送给客户端时,读者将在页面的HTML代码中看到__VIEWSTATE隐藏域内容。这是一些没有意义的字符串,是.NET框架通过Base64位编码对相关内容编码的结果。它们是通过明文方式在客户端和服务器端之间往返传送。在某些情况下,例如涉及密码、账号、连接字符串等敏感内容时,使用默认方式是很不安全的。为此,.NET框架为ViewState提供了两种安全机制:

  · 校验机制:

  可以通过设置EnableViewStateMAC="true"属性来指示.NET框架向ViewState数据中追加一个散列码(该散列码是一种SHA1类型,长度有160位,因此会严重影响执行性能)。在回传事件发生时,将重新建立该散列码,它必须和最初的散列码匹配。通过这种方式,能够有效检验ViewState是否在传送过程中能够被篡改。默认情况下,.NET框架使用SHA1算法来生成ViewState散列代码。此外,也可以通过在machine.config文件中设置<machineKey>来选择 MD5 算法,如下所示:<machineKey validation="MD5" />。MD5算法的性能要比SHA1算法好一些,但是同样不够安全。

  · 加密机制

  使用加密来保护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);
  }
 }
}

  如上代码所示,控件实现了两个属性Text和TextInViewState。Text属性使用了私有变量_text创建,这种实现无法保持该属性的状态信息。TextInViewState属性使用了ViewState,其通过set访问器,将属性值写入ViewState["TextInViewState"]对象中,通过get访问器,从对象ViewState["TextInViewState "]中获取属性值。这就是视图状态处理最简单的方法。当使用ViewState作为属性存储时,自定义服务器控件可以自行完成简单的状态信息管理,例如,TrackViewState、SaveViewState、LoadViewState等。当然,开发人员也可以通过重写方法自定义状态管理逻辑程序。在本例中,视图状态管理过程都是由.NET框架自动完成的。

  下面列举了为测试以上自定义服务器控件而创建的Default.aspx文件源代码。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
 void Button1_Click(object sender, EventArgs e) {
   demoLabel.Text = TextBox1.Text;
   demoLabel.TextInViewState = TextBox2.Text;
 }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>使用视图状态ViewState</title>
</head>
<body style="font-size: small;">
<form id="form1" runat="server"> <div> 姓名:

  以上代码显示在页面中包括两个文本框,两个按钮,以及一个自定义服务器控件LabelInViewState。如事件处理程序Button1_Click所示,当单击"提交"按钮时,LabelInViewState控件将获取文本框中文本,并显示出来。应用程序效果图如图1和图2所示。


图1 单击提交按钮

图2 单击重载按钮

  如图1所示,当用户在两个文本框中填写了文本,并单击"提交"按钮引发页面回传。此时,填写的文本内容将提交到服务器,并参与Button1_Click事件处理程序。这样,LabelInViewState控件则显示出了Text和TextInViewState属性值。之后,当用户单击"重载"按钮时,文本框内容仍然提交到服务器,但是,由于没有对应的事件处理程序,因此,LabelInViewState控件只显示已经存在的状态信息(即单击提交按钮之后保存的状态),即Text属性值为空,而TextInViewState属性值为tom@tom.com。通过以上过程可知,TextInViewState属性值都存储在视图状态ViewState中,因此,在页面往返过程中,该属性值得以保持,而Text只简单使用了私有变量,所以状态信息无法保持。另外,需要注意的是,由于默认情况下,页面启用了视图状态EnableViewState = "true",才能实现以上效果。

  小结

  本文主要介绍了视图状态的基本概念,并通过一个典型示例说明了应用方法。可能部分读者已经认识到,如果禁用了页面或者控件的视图状态,即设置EnableViewState = "false",那么上文服务器控件的属性TextViewState不是不能使用了吗?这的确是视图状态的缺陷所在。然而,这并不是说就无法解决这个问题了。在下文中,笔者将介绍另外一种ASP.NET 2.0新增的,与视图状态极为类似的技术特性--控件状态--它就能够很好的解决禁用视图状态的问题。


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·基于cpld的数字触发电路的设计
·消息队列(Message Queue)简介及其使用-.NET教程,评论及其它
·session_register()出错的解决办法-PHP教程,其它文章
·卫星通信中tcp协议分析改进方法研究
·漫谈Java语言的接口与类型安全-JSP教程,Java技巧及代码
·SQL SERVER2005連接字串中的@3/29-.NET教程,数据库应用
·自创]JCreator安装学习使用方法-数据库专栏,SQL Server
·ASP.NET 数据绑定常用代码-.NET教程,Asp.Net开发
·如何在J2ME的低级界面中轻松实现各种文字的自然分行显示-JSP教程,J2ME开发
·通信设备pac模块式开关电源的原理与维修
最新文章
·photoshop将肖像照片处理为铅笔素描_photoshop教程
·个人网站做联盟广告的几点经验_网赚技巧
·适合与不适合做google adsense的站_网赚技巧
·gg网赚之:怎么样利用e文站轻松月入100刀_网赚技巧
·黄明明归国创业寻觅伙伴:人品好是必要条件_站长访谈
·最普通的7种软文类型_站长访谈
·第九城市ceo朱骏 网海中闯出一片天_站长访谈
·反波访谈:听keso乱弹琴_站长访谈
·人性和互联网_站长心得
·大型网站常用的五种推广方法_站长心得
相关主题
  • asp.net应用程序资源访问安全模型_asp.net技巧
  • asp.net中多彩下拉框的实现_asp.net技巧
  • asp.net中数据校验部分的封装与应用_asp.net技巧
  • asp.net网络编程中常用到的27个函数集_asp.net基础
  • asp.net2.0学习历程 菜鸟到中级程序员的飞跃_asp.net基础
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭