国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

介紹ASP.NET服務(wù)器控件之視圖狀態(tài)

開發(fā) 后端
本文介紹的是ASP.NET服務(wù)器控件中的一個,視圖狀態(tài)。詳細(xì)介紹的視圖狀態(tài)的基本知識,并通過典型應(yīng)用介紹視圖狀態(tài)的應(yīng)用方法。希望對你有幫助,一起來看。

ASP.NET服務(wù)器控件是一種服務(wù)器端組件,它封裝了用戶界面及其相關(guān)的功能。ASP.NET 服務(wù)器控件直接或間接地從 System.Web.UI.Control 類派生。ASP.NET 服務(wù)器控件的超集包括 Web 服務(wù)器控件、HTML 服務(wù)器控件(基礎(chǔ)控件)、數(shù)據(jù)控件和 ASP.NET 移動控件。

為Web頁面及其控件保持狀態(tài)信息是非常有必要的。然而,由于Web應(yīng)用程序創(chuàng)建于HTTP協(xié)議的頂層,這是一個無狀態(tài)的協(xié)議,因此,保持狀態(tài)信息則變得非常困難。為了解決這個問題,ASP.NET 2.0技術(shù)提供了多種解決方案,例如,利用Session、Cookie、視圖狀態(tài)、控件狀態(tài)、隱藏域、查詢字符串、個性化用戶配置(Profile)等等。對于利用ASP.NET 2.0技術(shù)創(chuàng)建服務(wù)器控件而言,保持狀態(tài)信息也是非常重要的,其主要解決途徑是利用視圖狀態(tài)和控件狀態(tài)。本文詳細(xì)講解了視圖狀態(tài)(ViewState)的基本知識,并通過典型應(yīng)用介紹視圖狀態(tài)的應(yīng)用方法。

視圖狀態(tài)概述

視圖狀態(tài)是一項(xiàng)非常重要的技術(shù),它能使得頁面和頁面中的控件在從服務(wù)器到客戶端,再從客戶端返回的往返過程中保持狀態(tài)信息。這樣就可以在Web這種無狀態(tài)的環(huán)境之上創(chuàng)建一個有狀態(tài)并持續(xù)執(zhí)行的頁面效果。本節(jié)主要介紹有關(guān)視圖狀態(tài)的運(yùn)行機(jī)制、應(yīng)用方法、存儲的數(shù)據(jù)類型、性能和安全性、視圖狀態(tài)分塊(這是ASP.NET 2.0的新特性)和優(yōu)缺點(diǎn)等內(nèi)容。

(1)運(yùn)行機(jī)制

視圖狀態(tài)的具體運(yùn)行過程為:每當(dāng)用戶請求某個.aspx頁面時,.NET框架首先把相關(guān)控件的狀態(tài)數(shù)據(jù)序列化成一個字符串,然后,將其做為名為__VIEWSTATE的隱藏域的Value值發(fā)送到客戶端。如果頁面是第一次被請求,那么服務(wù)器控件也將是被第一次執(zhí)行時,名為__VIEWSTATE的隱藏域中只包含控件的默認(rèn)信息,通常為空或者null。在隨后的回送事件中,ViewState中就保存了服務(wù)器控件在前面回送中可用的屬性狀態(tài)。這樣服務(wù)器控件就可以監(jiān)視在當(dāng)前被處理的回送事件發(fā)生之前的狀態(tài)了。這些過程是由.NET框架負(fù)責(zé)的,對用戶來說是執(zhí)行.aspx頁面就有了持續(xù)執(zhí)行的效果。

(2)存儲的數(shù)據(jù)類型

視圖狀態(tài)可以存儲多種類型的數(shù)據(jù),并且為了提高運(yùn)行效率,視圖狀態(tài)自身還包括一套已經(jīng)優(yōu)化的針對常用類型的序列化方式。視圖狀態(tài)序列化方式默認(rèn)支持的數(shù)據(jù)類型包括以下幾種:String、Int32、Unit、Color、Array、ArrayList、HashTable和自定義類型轉(zhuǎn)換器TypeConverter。

視圖狀態(tài)已經(jīng)為Array、ArrayList和包含上面列出類型的HashTable對象進(jìn)行了優(yōu)化。因此,當(dāng)在控件中使用視圖狀態(tài)時,應(yīng)該試著限定于使用以上簡單數(shù)據(jù)類型,以及經(jīng)過優(yōu)化的類型。在此,需要重點(diǎn)說明一下自定義類型轉(zhuǎn)換器TypeConverter,它提供了一種將值的類型轉(zhuǎn)換為其他類型以及訪問標(biāo)準(zhǔn)值和子屬性的統(tǒng)一方法。例如,可以利用TypeConverter將字符串轉(zhuǎn)換為數(shù)值,或者將數(shù)值轉(zhuǎn)換為字符串。如果沒有類型轉(zhuǎn)換器,那么頁面框架會使用.NET框架提供的二進(jìn)制序列化功能來序列化對象,這個過程是非常耗費(fèi)資源的。

(3)性能和安全性

使用視圖狀態(tài)時,對象必須先序列化,然后再通過回傳進(jìn)行反序列化。因此,我們必須了解有關(guān)ViewState性能的內(nèi)容。默認(rèn)情況下,控件的ViewState將被啟用,如果不需要使用ViewState,最好還是將它關(guān)閉。以下情況將不再需要ViewState:(1)控件未定義服務(wù)器端事件(這時的控件事件均為客戶端事件且不參加回送的);(2)控件沒有動態(tài)的或數(shù)據(jù)綁定的屬性值。關(guān)閉視圖狀態(tài)的方法是將控件的EnableViewState的值設(shè)置為"false",即EnableViewState="false"。

默認(rèn)情況下,視圖狀態(tài)的有關(guān)內(nèi)容在編譯運(yùn)行發(fā)送給客戶端時,讀者將在頁面的HTML代碼中看到__VIEWSTATE隱藏域內(nèi)容。這是一些沒有意義的字符串,是.NET框架通過Base64位編碼對相關(guān)內(nèi)容編碼的結(jié)果。它們是通過明文方式在客戶端和服務(wù)器端之間往返傳送。在某些情況下,例如涉及密碼、賬號、連接字符串等敏感內(nèi)容時,使用默認(rèn)方式是很不安全的。為此,.NET框架為ViewState提供了兩種安全機(jī)制:

A、校撿機(jī)制

可以通過設(shè)置EnableViewStateMAC="true"屬性來指示.NET框架向ViewState數(shù)據(jù)中追加一個散列碼(該散列碼是一種SHA1類型,長度有160位,因此會嚴(yán)重影響執(zhí)行性能)。在回傳事件發(fā)生時,將重新建立該散列碼,它必須和最初的散列碼匹配。通過這種方式,能夠有效檢驗(yàn)ViewState是否在傳送過程中能夠被篡改。默認(rèn)情況下,.NET框架使用SHA1算法來生成ViewState散列代碼。此外,也可以通過在machine.config文件中設(shè)置<machineKey>來選擇 MD5 算法,如下所示:<machineKey validation="MD5" />。MD5算法的性能要比SHA1算法好一些,但是同樣不夠安全。

B、 加密機(jī)制

使用加密來保護(hù)ViewState字段中的實(shí)際數(shù)據(jù)值。首先,必須如上所述設(shè)置EnableViewStatMAC="true"。然后,將machineKey validation類型設(shè)置為3DES,即

  1. <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="3DES" /> 

 

這指示ASP.NET使用3DES加密算法來加密ViewState值。

(4)視圖狀態(tài)分塊

以上內(nèi)容介紹了視圖狀態(tài)的一些基本知識。然而,可能部分讀者會有些疑惑:如果在某些情況下,視圖狀態(tài)數(shù)據(jù)變得很大,那怎么辦呢?這樣顯然會出現(xiàn)一些意想不到的后果。為此,ASP.NET 2.0新增了一種名為"視圖狀態(tài)分塊"的功能。如果視圖狀態(tài)的數(shù)據(jù)量變得太大,視圖狀態(tài)分塊自動將數(shù)據(jù)分成多個塊區(qū),并將這些數(shù)據(jù)放在多個隱藏形式的字段中。

若要啟用視圖狀態(tài)分塊,可將MaxPageStateFieldLength屬性設(shè)置為在單個視圖狀態(tài)字段中允許的最大大小(以字節(jié)為單位)。當(dāng)該頁回發(fā)到服務(wù)器時,該頁會在頁初始化階段分析視圖狀態(tài)字符串,并還原頁中的屬性信息。默認(rèn)設(shè)置是-1,這表示不存在最大大小,不會將視圖狀態(tài)分成多個塊區(qū)。

(5)優(yōu)點(diǎn)和缺點(diǎn)

使用視圖狀態(tài)具有以下3個優(yōu)點(diǎn):

一、耗費(fèi)的服務(wù)器資源較少(與Application、Session相比)。因?yàn)椋晥D狀態(tài)數(shù)據(jù)都寫入了客戶端計算機(jī)中。

二、易于維護(hù)。默認(rèn)情況下,.NET系統(tǒng)自動啟用對控件狀態(tài)數(shù)據(jù)的維護(hù)。

三、增強(qiáng)的安全功能。視圖狀態(tài)中的值經(jīng)過哈希計算和壓縮,并且針對Unicode實(shí)現(xiàn)進(jìn)行編碼,其安全性要高于使用隱藏域。

使用視圖狀態(tài)具有以下3個缺點(diǎn):

一、性能注意事項(xiàng)。由于視圖狀態(tài)存儲在頁本身,因此如果存儲較大的值,即使在視圖狀態(tài)分塊的情況下,用戶顯示頁和發(fā)送頁時的速度仍然可能減慢。

二、設(shè)備限制。移動設(shè)備可能沒有足夠的內(nèi)存容量來存儲大量的視圖狀態(tài)數(shù)據(jù)。因此,移動設(shè)備上的服務(wù)器控件時,將使用其他的實(shí)現(xiàn)方法。

三、潛在的安全風(fēng)險。視圖狀態(tài)存儲在頁上的一個或多個隱藏域中。雖然視圖狀態(tài)以哈希格式存儲數(shù)據(jù),但它可以被篡改。如果直接查看頁輸出源,可以看到隱藏域中的信息,這導(dǎo)致潛在的安全性問題。

#p#

典型應(yīng)用

在利用ASP.NET 2.0技術(shù)進(jìn)行服務(wù)器控件開發(fā)過程中,有很多方面可以用到視圖狀態(tài)。常見的是利用ViewState字典實(shí)現(xiàn)服務(wù)器控件屬性。ViewState是System.Web.UI.StateBag類型-一個鍵/值對的字典,服務(wù)器控件的屬性值可以存儲在ViewState中。下面通過一個典型示例,說明ViewState的應(yīng)用方法。

在自定義服務(wù)器控件LabelInViewState中,實(shí)現(xiàn)了兩個屬性Text和TextInViewState。前者使用私有變量創(chuàng)建,后者使用ViewState實(shí)現(xiàn)。它們都用于獲取或者設(shè)置文本內(nèi)容。自定義控件實(shí)現(xiàn)文件LabelInViewState.cs源代碼如下所示。

 

  1. using System;using System.Collections.Generic;  
  2. using System.ComponentModel;using System.Text;  
  3. using System.Web;  
  4. using System.Web.UI;  
  5. using System.Web.UI.WebControls;namespace WebControlLibrary{  
  6.  [DefaultProperty("Text")]   
  7.  [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")]  
  8.  public class LabelInViewState : WebControl {   
  9. private string _text; //實(shí)現(xiàn)Text屬性  
  10. public string Text {  
  11.  get {   
  12. return (_text == null) ? string.Empty : _text;  
  13.  }  
  14.  set { _text = value; }  
  15. }  
  16. //使用ViewState實(shí)現(xiàn)TextInViewState屬性   
  17. public string TextInViewState {  
  18.  get {  
  19. String s = (String)ViewState["TextInViewState"];  
  20. return ((s == null) ? String.Empty : s);  
  21.  }  
  22.  set { ViewState["TextInViewState"] = value; }  
  23. }  
  24. // 重寫RenderContents方法   
  25. protected override void RenderContents(HtmlTextWriter output) {   
  26.  output.Write("Text = ");  
  27.  output.Write(Text);  
  28.  output.Write("<br/>");   
  29.  output.Write("TextInViewState = ");  
  30.  output.Write(TextInViewState);   
  31. }  
  32.  }  

 

如上代碼所示,控件實(shí)現(xiàn)了兩個屬性Text和TextInViewState。Text屬性使用了私有變量_text創(chuàng)建,這種實(shí)現(xiàn)無法保持該屬性的狀態(tài)信息。TextInViewState屬性使用了ViewState,其通過set訪問器,將屬性值寫入ViewState["TextInViewState"]對象中,通過get訪問器,從對象ViewState["TextInViewState "]中獲取屬性值。這就是視圖狀態(tài)處理最簡單的方法。當(dāng)使用ViewState作為屬性存儲時,自定義服務(wù)器控件可以自行完成簡單的狀態(tài)信息管理,例如,TrackViewState、SaveViewState、LoadViewState等。當(dāng)然,開發(fā)人員也可以通過重寫方法自定義狀態(tài)管理邏輯程序。在本例中,視圖狀態(tài)管理過程都是由.NET框架自動完成的。

下面列舉了為測試以上自定義服務(wù)器控件而創(chuàng)建的Default.aspx文件源代碼。

 

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>  
  2. <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <script runat="server">   
  6.  void Button1_Click(object sender, EventArgs e) {   
  7.  demoLabel.Text = TextBox1.Text;   
  8.  demoLabel.TextInViewState = TextBox2.Text;   
  9.  }  
  10. </script>  
  11. <html xmlns="http://www.w3.org/1999/xhtml">  
  12. <head runat="server">   
  13. <title>使用視圖狀態(tài)ViewState</title>  
  14. </head>  
  15. <body style="font-size: small;">  
  16. <form id="form1" runat="server"> <div> 

 

以上代碼顯示在頁面中包括兩個文本框,兩個按鈕,以及一個自定義服務(wù)器控件LabelInViewState。如事件處理程序Button1_Click所示,當(dāng)單擊"提交"按鈕時,LabelInViewState控件將獲取文本框中文本,并顯示出來。應(yīng)用程序效果圖如圖1和圖2所示。

單擊提交按鈕

圖1 單擊提交按鈕

單擊重載按鈕

圖2 單擊重載按鈕

如圖1所示,當(dāng)用戶在兩個文本框中填寫了文本,并單擊"提交"按鈕引發(fā)頁面回傳。此時,填寫的文本內(nèi)容將提交到服務(wù)器,并參與Button1_Click事件處理程序。這樣,LabelInViewState控件則顯示出了Text和TextInViewState屬性值。之后,當(dāng)用戶單擊"重載"按鈕時,文本框內(nèi)容仍然提交到服務(wù)器,但是,由于沒有對應(yīng)的事件處理程序,因此,LabelInViewState控件只顯示已經(jīng)存在的狀態(tài)信息(即單擊提交按鈕之后保存的狀態(tài)),即Text屬性值為空,而TextInViewState屬性值為tom@tom.com。通過以上過程可知,TextInViewState屬性值都存儲在視圖狀態(tài)ViewState中,因此,在頁面往返過程中,該屬性值得以保持,而Text只簡單使用了私有變量,所以狀態(tài)信息無法保持。另外,需要注意的是,由于默認(rèn)情況下,頁面啟用了視圖狀態(tài)EnableViewState = "true",才能實(shí)現(xiàn)以上效果。

小結(jié)

本文主要介紹了視圖狀態(tài)的基本概念,并通過一個典型示例說明了應(yīng)用方法。可能部分讀者已經(jīng)認(rèn)識到,如果禁用了頁面或者控件的視圖狀態(tài),即設(shè)置EnableViewState = "false",那么上文服務(wù)器控件的屬性TextViewState不是不能使用了嗎?這的確是視圖狀態(tài)的缺陷所在。然而,這并不是說就無法解決這個問題了。在下文中,筆者將介紹另外一種ASP.NET 2.0新增的,與視圖狀態(tài)極為類似的技術(shù)特性--控件狀態(tài)--它就能夠很好的解決禁用視圖狀態(tài)的問題。

 

責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-08-04 15:13:38

2009-08-10 14:25:33

ASP.NET服務(wù)器控

2009-08-04 13:10:05

ASP.NET服務(wù)器控

2011-07-12 15:17:02

ASP.net服務(wù)器控件

2009-08-10 14:08:15

ASP.NET服務(wù)器控ASP.NET組件設(shè)計

2009-08-06 14:16:04

ASP.NET服務(wù)器控

2009-08-06 14:42:54

ASP.NET服務(wù)器控

2009-08-03 15:43:22

asp.net控件

2009-08-05 17:11:51

ASP.NET控件開發(fā)ASP.NET服務(wù)器控

2009-08-04 17:18:37

2009-08-03 18:00:00

ASP.NET服務(wù)器控

2009-07-28 09:46:53

ASP.NET服務(wù)器控

2009-07-30 16:52:38

復(fù)合控件ASP.NET服務(wù)器控

2009-08-07 11:12:58

ASP.NET控件開發(fā)

2009-07-27 12:56:27

控件CheckBoxLASP.NET服務(wù)器

2009-08-04 13:39:43

ASP.NET 2.0

2009-08-05 15:57:03

ASP.NET控件ID

2009-08-06 11:24:50

ASP.NET服務(wù)器控

2009-08-07 13:56:46

ASP.NET控件開發(fā)

2009-08-01 10:07:58

ASP.NET服務(wù)器控ASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日本激情免费| 蜜芽视频在线观看| 亚洲电影在线一区二区三区| 亚洲欧洲在线播放| 欧美高清电影在线| 夜夜亚洲天天久久| 欧美日韩亚洲第一| 黄色小说综合网站| 成人在线观看黄色| 日本一区二区三区视频在线看 | 精品日韩成人av| 青青色在线视频| 中文字幕中文字幕在线一区| 美女尤物久久精品| 亚洲六月丁香色婷婷综合久久| 9191精品国产综合久久久久久| 国产91精品视频在线观看| 成年人免费大片| 97色伦图片97综合影院| 亚洲欧洲av一区二区| 中文字幕97| 日韩极品在线| 在线精品视频一区二区三四| 国产福利精品av综合导导航| 先锋影音欧美性受| 国产1区2区3区精品美女| 亚洲sss视频在线视频| 欧美精品福利在线| 在线视频不卡一区二区| 一级在线观看| 国产精品免费不| 国产91色综合久久免费分享| 91麻豆精品国产91久久久资源速度| 色涩成人影视在线播放| 青青国产精品| 在线综合+亚洲+欧美中文字幕| 免费在线a视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 米奇777四色精品人人爽| 亚洲国产精品影院| 轻轻色免费在线视频| 精品欧美一区二区三区| 视频二区在线| 欧美亚洲一区三区| a天堂中文在线88| 欧美一区二区三区在线观看| 中老年在线免费视频| 伊人一区二区三区久久精品| 成人久久精品| 欧美亚洲激情在线| 999国产精品永久免费视频app| 国产美女精品久久久| 欧美亚洲一区二区三区| 男女裸体影院高潮| 欧美国产在线观看| 日韩美女一级视频| 日韩久久免费电影| 久久男人av| 亚洲最大成人免费视频| 久久99国产精品久久99| 亚洲理论电影在线观看| 18成人在线观看| h视频在线免费| 亚洲香蕉成视频在线观看| 神马香蕉久久| 精品国产日本| 91欧美一区二区| 久久免费看视频| 亚洲人成免费电影| 伊人久久综合影院| 日韩午夜视频在线观看| 中文字幕高清一区| yiren22综合网成人| 色偷偷9999www| 中文在线播放一区二区| 91传媒免费视频| 日韩欧美成人免费视频| 日本综合视频| 亚洲va电影大全| 岛国一区二区三区| 精品资源在线看| 欧美美女18p| 亚洲免费精品| 色偷偷亚洲女人天堂观看欧| 日韩成人性视频| 久久久久久久久久久久久久| 国产成人无码一二三区视频| 欧美一级理论片| 欧美理论在线播放| 日本中文字幕网址| 日韩欧美中文字幕精品| 日韩成人精品一区二区| 蜜臀av色欲a片无码精品一区 | av中文字幕在线观看| 另类专区欧美制服同性| 99精品国产在热久久下载| 欧美一级黄色影院| 亚洲福利视频久久| 国产综合色产| 成视人a免费观看视频| 最新91在线视频| 视频精品一区二区| 国产在线网站| 日本亚洲欧美三级| 久久久天堂av| 在线看片福利| 欧美亚洲免费在线| 91久久精品一区二区| 深爱激情综合网| 久久黄色免费看| 亚洲人成在线观看网站高清| 国产农村妇女精品一二区| 中文字幕在线免费专区| 97不卡在线视频| 99re热这里只有精品免费视频| 丁香花视频在线观看| 久久涩涩网站| 欧美性欧美巨大黑白大战| 久久一本综合| 国产黄色免费电影| 午夜精品福利电影| 久久久不卡网国产精品一区| 999国产精品亚洲77777| 亚洲精品国产suv一区88| 亚洲精品一线二线三线无人区| 一区二区亚洲精品| 理论视频在线| 成人免费视频视频在| 日韩欧美国产一区二区| 久久久久久久久久久9不雅视频 | 97视频免费在线观看| 91丨porny丨国产入口| 日韩成人亚洲| 亚洲一区 在线播放| 日韩网站在线看片你懂的| 国产一区二区三区四区老人| 欧美婷婷久久五月精品三区| 成人国产精品一区| 日韩欧美亚洲国产一区| 久久久久电影| 东凛在线观看| 久久综合福利| 亚洲国产精久久久久久| 国产激情精品久久久第一区二区| 蜜桃精品在线| 水蜜桃色314在线观看| www.欧美三级电影.com| 成人午夜精品一区二区三区| 欧美国产视频| www.亚洲高清| 国产精品视频一| 欧美伊人久久久久久久久影院| 国产字幕视频一区二区| 蜜桃av在线免费观看| 亚洲狠狠婷婷综合久久久| 欧美va亚洲va国产综合| 韩国三级在线一区| 2019中文亚洲字幕| 日本wwwwwwwzzzzz视频| 91精品视频在线| 日韩天堂在线观看| 不卡视频在线看| 香蕉一区二区| 可以直接在线观看的av| 青青草原亚洲| 中文字幕亚洲一区| 亚洲久草在线视频| 99精品福利视频| 网友自拍亚洲| jizzjizzjizz亚洲女| 3d蒂法精品啪啪一区二区免费| 欧美一区午夜视频在线观看| 国产精品911| 国产乱论精品| 九九在线视频| 亚洲高潮无码久久| 欧美一区二区三区艳史| 欧美日本精品一区二区三区| 黄一区二区三区| 亚洲日本三级| 性欧美ⅴideo另类hd| 成人3d动漫一区二区三区| 91精品婷婷国产综合久久蝌蚪| 亚洲精品一区二区久| 国产精品久久久久久久岛一牛影视| 91精品啪在线观看国产18| 日韩伦理在线一区| 色总=综合色| 日韩电影天堂视频一区二区| 久久久久久久影院| 欧美一级在线观看| 亚洲视频狠狠干| 久久爱另类一区二区小说| 免费看av成人| 在线能看的av网址| 自拍偷拍电影| 欧美成人精品免费| 国产 高清 精品 在线 a| 欧美剧在线观看| 欧美一区二区三区四区高清|