亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET服務器控件之視圖狀態

2019-11-18 17:11:25
字體:
來源:轉載
供稿:網友

  為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框架提供的二進制序列化功能來序列化對象,這個過程是非常耗費資源的。

 ?。?)性能和安全性

  使用視圖狀態時,對象必須先序列化,然后再通過回傳進行反序列化。因此,我們必須了解有關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值。

 ?。?)視圖狀態分塊

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

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

 ?。?)優點和缺點

  使用視圖狀態具有以下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新增的,與視圖狀態極為類似的技術特性--控件狀態--它就能夠很好的解決禁用視圖狀態的問題。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲一区二区三区| 日韩高清电影免费观看完整版| 九九九久久国产免费| 亚洲国产成人在线播放| 日韩欧美精品免费在线| 日本国产高清不卡| www.久久撸.com| 欧美高清不卡在线| 国产视频综合在线| 国产精品成人av性教育| 91精品国产91久久久久久| 欧美午夜宅男影院在线观看| 中文字幕在线视频日韩| 国产精品免费看久久久香蕉| 国产精品欧美风情| 欧美日韩亚洲系列| 日韩av在线高清| 日韩美女视频中文字幕| 欧美第一淫aaasss性| 亚洲第一av网| 97精品视频在线观看| 亚洲香蕉成人av网站在线观看| 成人在线观看视频网站| 国产精品第1页| 国产成人精品免费久久久久| 色阁综合伊人av| 久久久久久噜噜噜久久久精品| 日韩hd视频在线观看| 日韩久久免费电影| 69国产精品成人在线播放| 久久伊人免费视频| 狠狠久久亚洲欧美专区| 欧美成人免费网| 久久久精品影院| 国产精品91久久| 国产v综合ⅴ日韩v欧美大片| 欧美亚洲日本黄色| 亚洲精品一区二区网址| 亚洲精品网站在线播放gif| 91精品国产91| 国产日产欧美a一级在线| 久久99视频精品| 亚洲国产精品小视频| 日韩美女免费观看| 国产精品亚洲一区二区三区| 91香蕉亚洲精品| 亚洲国产成人精品久久| 欧美视频中文在线看| 亚洲开心激情网| 97视频在线观看免费高清完整版在线观看| 欧美一级bbbbb性bbbb喷潮片| 欧美中文字幕视频| 日韩的一区二区| 国产欧美日韩免费看aⅴ视频| 超在线视频97| 国产福利精品视频| 最近2019年手机中文字幕| 久久免费视频这里只有精品| 97香蕉超级碰碰久久免费软件| 亚洲人成自拍网站| 欧美成人亚洲成人日韩成人| 国产精品吹潮在线观看| 97超级碰碰人国产在线观看| 亚洲图片欧美日产| 亚洲欧美日韩精品久久奇米色影视| 国产精品白丝jk喷水视频一区| 揄拍成人国产精品视频| 亚洲午夜精品视频| 欧美激情精品久久久| 欧美成人精品一区二区| 7777免费精品视频| 久久天堂av综合合色| 亚洲视频在线免费观看| 国产视频福利一区| 国产精品高潮呻吟久久av黑人| 国产日韩综合一区二区性色av| 亚洲91精品在线观看| 久久成年人免费电影| 欧美视频精品一区| 91视频免费网站| 伊人亚洲福利一区二区三区| www.日韩.com| 国产精品成人免费电影| 国产97人人超碰caoprom| 国产成人综合一区二区三区| 亚洲国内精品在线| 亚洲精品久久在线| 国产成人精品在线观看| 日韩精品在线电影| 欧美成aaa人片在线观看蜜臀| 精品亚洲aⅴ在线观看| 精品国产拍在线观看| 日韩在线中文视频| 色悠久久久久综合先锋影音下载| 亚洲欧美日韩另类| 日韩在线视频网站| 在线视频欧美日韩精品| 91亚洲国产成人久久精品网站| 青青草原一区二区| 欧美一区二区三区艳史| 奇米一区二区三区四区久久| 在线观看不卡av| 午夜精品免费视频| 欧美极品少妇xxxxⅹ裸体艺术| 欧美性感美女h网站在线观看免费| 亚洲综合成人婷婷小说| 欧美国产欧美亚洲国产日韩mv天天看完整| 丝袜亚洲另类欧美重口| 日韩禁在线播放| 亚洲天堂2020| 91美女福利视频高清| 国产精品日韩av| 欧美www视频在线观看| 欧美成人午夜激情视频| 神马久久久久久| 91久久久久久久久久久| 欧美激情啊啊啊| 亚洲精品99久久久久中文字幕| 国产精品日日摸夜夜添夜夜av| 亚洲美女免费精品视频在线观看| 亚洲午夜久久久久久久| 国产一区二区三区精品久久久| 亚洲精品ady| 奇米4444一区二区三区| 国产亚洲精品一区二区| 久久久久久国产免费| 亚洲一区二区三区毛片| 欧美亚洲成人精品| 日韩禁在线播放| 亚洲国产精品嫩草影院久久| 国自产精品手机在线观看视频| 97国产精品人人爽人人做| 精品亚洲男同gayvideo网站| 欧美性xxxx极品hd满灌| 欧美人在线观看| 欧美一级片久久久久久久| www国产亚洲精品久久网站| 亚洲欧美日本另类| 欧美华人在线视频| 国内精品久久久久影院优| 在线视频国产日韩| 日韩中文字幕在线视频| 欧美床上激情在线观看| 精品中文字幕久久久久久| 亚洲日本欧美日韩高观看| 日韩欧美在线观看视频| 久久九九精品99国产精品| 欧美大片免费观看| 色妞一区二区三区| 国产成人jvid在线播放| 亚洲精品欧美日韩专区| 亚洲精品一区二区网址| 91免费精品视频| 亚洲免费伊人电影在线观看av| 国产偷国产偷亚洲清高网站| 国产精品久久久久久久久久| 国产精品久久久久一区二区| 国产午夜精品一区理论片飘花| 超在线视频97| 成人国产精品久久久| 97色在线视频观看| 亚洲人成绝费网站色www| 欧美高清理论片| 国产在线98福利播放视频|