ASP编程:ASP.NET办事器控件之视图形态
ASP一般认为只能运行在IIS上,正如前面所提到的,这并不是十分正确,事实上,ASP也能运行在Apache上。Apache ASP可在任意Apache服务器上运行有限的ASP功能,所需做的,只需打开mod_perl。 为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个长处:1、消耗的办事器资本较少(与Application、Session比拟)。由于,视图形态数据都写入了客户端盘算机中。2、易于保护。默许情形下,.NET体系主动启用对控件形态数据的保护。3、加强的平安功效。视图形态中的值经由哈希盘算和紧缩,而且针对Unicode完成停止编码,其平安性要高于利用埋没域。
利用视图形态具有以下3个弱点:1、功能注重事项。因为视图形态存储在页自己,因而假如存储较大的值,即便在视图形态分块的情形下,用户显示页和发送页时的速度依然能够减慢。2、装备限制。挪动装备能够没有足够的内存容量来存储大批的视图形态数据。因而,挪动装备上的办事器控件时,将利用其他的完成办法。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{
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新增的,与视图形态极其相似的手艺特征--控件形态--它就可以够很好的处理禁用视图形态的成绩。
源代码保护方面其实现在考虑得没那么多了..NET也可以反编译.ASP写得复杂的话别人能看得懂的话.他也有能力自己写了.这方面担心的倒不太多. 纵观现在网上可以下载的那些所谓BBS还有什么网站等等的源代码 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。 哪些内置对象是可以跳过的,或者哪些属性和方法是用不到的? ASP的语言不仅仅只是命令格式差不多,而是包含在<%%>之内的命令完全就是VB语法。虽然ASP也是做为单独的一个技术来提出的,但他就是完全继承了VB所有的功能。 兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。 接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。 我想问如何掌握学习节奏(先学什么再学什么)最好详细点? 如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助: ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的 运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。 ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。 不能只是将它停留在纸上谈兵的程度上。 跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组 他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。 我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。
页:
[1]