仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1376|回复: 19
打印 上一主题 下一主题

[学习教程] ASP编程:ASP.NET办事器控件之视图形态

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:33:49 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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{
 [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新增的,与视图形态极其相似的手艺特征--控件形态--它就可以够很好的处理禁用视图形态的成绩。
源代码保护方面其实现在考虑得没那么多了..NET也可以反编译.ASP写得复杂的话别人能看得懂的话.他也有能力自己写了.这方面担心的倒不太多. 纵观现在网上可以下载的那些所谓BBS还有什么网站等等的源代码
小女巫 该用户已被删除
沙发
 楼主| 发表于 2015-3-20 20:50:04 | 显示全部楼层
兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-11 06:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表