• ViewState探索


    什么是 view state?

     View State是客户端状态管理重要机制之一。当页面PostBack(向服务器发送或获得数据)时,它能存储页面的值。
    ASP.NET把View State属性作为页面面内置的结构。当多个请求相同的页面时自动存储数据。

    例子:

    如果你向加一个变量到View State,

    1. ViewState["Var"]=Count;  

    从View State返回数据

    1. string Test=ViewState["TestVal"];  

    在返回数据时,经常我们需要对ViewState中的值进行类型转换

     

    view state有那些好处?

        * 易于实现
        * 不需要服务器资源
        * 可增强安全性 ,它能被压缩或编码。

    view state有那些缺点?

        * 如果保存比较大的数据,将增加性能开销。因为它和页面相关。
        * 如果它把数据以散列格式存放在隐藏域中,容易被捕获
        * 在移动设备中不被支持。

    什么时候使用view state?

    当你选择View State作为维护页面状态的机制时,应该记住下面几点:

        * 数据应该比较小,因为数据和页面控件绑定。数据量大,导致性能开销多大。
        * 避免在view state存储安全要求高的数据。

    什么时候避免使用view state?

    在下列情况下,控件不需要view state:

        * 控件从不改变
        * 控件每次PostBack重新构建
        * 控件时input类型,只有用户才能改变

    view state存在那里?

    View State把页面控件的值散列,编码为一个字符串。它仅包含页面和控件信息。它和服务器没有交互。它一直保存在客户端浏览器的页面里。ViewState使用隐藏域保存这些编码后的信息。
    假想你写一段简单的代码,保存控件的值:

    1. ViewState["Value"] = MyControl.Text;  

    运行应用程序,在浏览器,右键 > 查看源文件。 你将得到下面代码块。

     ViewState探索

    值看起来向被加密的字符串。这是Base64编码。这不是加密字符串,所以易于解码。

    在view state怎么存储对象? 

    我们能容易的存储一个对象,就像存储字符串,和int类型的变量。但我们需要把它转为字节流,因为ViewState存储数据在页面隐藏域中。所以我们需要序列化。如果要存放在view state中的数据没有被序列化,将出现错误。

    1. [Serializable]  
    2. public class student  
    3. {  
    4.     public int Roll;  
    5.     public string Name;  
    6.     public void AddStudent(int intRoll,int strName)  
    7.       {  
    8.         this.Roll=intRoll;  
    9.         this.Name=strName;  
    10.            }  
    11. }  

    把类student的对象存储在view state.

    1.  //Store Student Class in View State  
    2. student _objStudent = new student();  
    3. _objStudent.AddStudent(2, "Abhijit");  
    4. ViewState["StudentObject"] = _objStudent;  
    5.   
    6. //Retrieve Student information view state  
    7.  student _objStudent;  
    8. _objStudent = (student)ViewState["StudentObject"];   

    怎么跟踪view state信息?

    如果想跟踪view state信息, 通过Page指令的Trace属性为true。

    1. <%@ Page Language="C#" Trace="true"   

    运行web应用程序。你将在树状控件区看到控件ID,和ViewState大小等详细信息。不要担心"Render Size Byte" , 它是控件的大小。

     ViewState探索

    启用或禁止View State

    你可以启用或禁止单个控件View state,也可以启用或禁止页面级别的View State.设置控件EnableViewState属性false,可以关掉单个控件的View State.例如:

    1. TextBox1.EnableViewState =false;  

    通过Page指令的EnableViewState属性为false.关闭整个页面的View State.

    1. <%@ Page Language="C#"  EnableViewState="false"   

    即使禁止了整个页面的View State.你将看到在隐藏的view state标签中仍然保存少量信息。这是因为ASP.NET一直最少量的保存控件的层级关系信息。即使View State被关闭了。

    为了启动View State,你需要把相应的数据设置为True.下面是一个启动单个控件View State的例子:

    1. TextBox1.EnableViewState =true;  

    启动页面级别ViewState的例子:

    1. <%@ Page Language="C#"  EnableViewState="true"  

    怎么保证View State的安全性?

    我已经说了View State信息是以Base64字符串编码保存在隐藏域中。它看起来象:

    ViewState探索


    许多ASP.NET程序员以为这是被加密的格式。我再说一次,这不是加密的字符串,它很容易被破解。为了确保View State的安全,可以进行两个设置:
        *      首先,你要确保View State信息使用"hash code"防干扰的。 可以通过Page指令 EnableViewStateMAC属性为true. MAC 代表"Message Authentication Code"

     

    1. <%@ Page Language="C#" EnableViewState="true" EnableViewStateMac="true"   


    hash code(保密性强的校验)由ASP.NET计算出。被附加到View State内容中保存于隐藏域。再下次PostBack时,那个校验码被验证。如果有错误,Post Back将被拒绝,我们也可以再web.config中设置该属性。

        *      第二个设置是:通过Page指令ViewStateEncryptionMode属性为Always。这将加密View State数据。如下设置:

     

    1. <%@ Page Language="C#" EnableViewState="true" ViewStateEncryptionMode="Always"  

    ViewStateEncryptionMode 有三个可选项:

        * Always
        * Auto
        * Never
    Always意味着View State一直被加密。Never意味者从来不加密。Auto意味着对特别指定的控件加密,该控件必须调用Page.RegisterRequiresViewStateEncryption()方法请求加密。

    也可以在web.config中设置 "EnableViewStateMAC" 和 ViewStateEncryptionMode"

    1. <system.web>  
    2.   <pages viewStateEncryptionMode ="Always"  
    3.           enableViewStateMac ="true"/>  
    4. </system.web>  

    注意 : 避免不必要的加密。因为这导致性能问题。

    一些重要点

    问题回答
    客户端还是服务器端 客户端
    是否使用服务器资源
    是否易于实现
    是否有性能问题 对于大数据,加密,解密会有
    支持加密解密? 支持
    能存储对象? 可以。但需要在类上加serialize关键字
    会超时吗? 不会

    什么是 view state?

     View State是客户端状态管理重要机制之一。当页面PostBack(向服务器发送或获得数据)时,它能存储页面的值。
    ASP.NET把View State属性作为页面面内置的结构。当多个请求相同的页面时自动存储数据。

    例子:

    如果你向加一个变量到View State,

    1. ViewState["Var"]=Count;  

    从View State返回数据

    1. string Test=ViewState["TestVal"];  

    在返回数据时,经常我们需要对ViewState中的值进行类型转换

    view state有那些好处?

        * 易于实现
        * 不需要服务器资源
        * 可增强安全性 ,它能被压缩或编码。

    view state有那些缺点?

        * 如果保存比较大的数据,将增加性能开销。因为它和页面相关。
        * 如果它把数据以散列格式存放在隐藏域中,容易被捕获
        * 在移动设备中不被支持。

    什么时候使用view state?

    当你选择View State作为维护页面状态的机制时,应该记住下面几点:

        * 数据应该比较小,因为数据和页面控件绑定。数据量大,导致性能开销多大。
        * 避免在view state存储安全要求高的数据。

    什么时候避免使用view state?

    在下列情况下,控件不需要view state:

        * 控件从不改变
        * 控件每次PostBack重新构建
        * 控件时input类型,只有用户才能改变

    view state存在那里?

    View State把页面控件的值散列,编码为一个字符串。它仅包含页面和控件信息。它和服务器没有交互。它一直保存在客户端浏览器的页面里。ViewState使用隐藏域保存这些编码后的信息。
    假想你写一段简单的代码,保存控件的值:

    1. ViewState["Value"] = MyControl.Text;  

    运行应用程序,在浏览器,右键 > 查看源文件。 你将得到下面代码块。

     ViewState探索

    值看起来向被加密的字符串。这是Base64编码。这不是加密字符串,所以易于解码。

    在view state怎么存储对象? 

    我们能容易的存储一个对象,就像存储字符串,和int类型的变量。但我们需要把它转为字节流,因为ViewState存储数据在页面隐藏域中。所以我们需要序列化。如果要存放在view state中的数据没有被序列化,将出现错误。

    1. [Serializable]  
    2. public class student  
    3. {  
    4.     public int Roll;  
    5.     public string Name;  
    6.     public void AddStudent(int intRoll,int strName)  
    7.       {  
    8.         this.Roll=intRoll;  
    9.         this.Name=strName;  
    10.            }  
    11. }  

    把类student的对象存储在view state.

    1.  //Store Student Class in View State  
    2. student _objStudent = new student();  
    3. _objStudent.AddStudent(2, "Abhijit");  
    4. ViewState["StudentObject"] = _objStudent;  
    5.   
    6. //Retrieve Student information view state  
    7.  student _objStudent;  
    8. _objStudent = (student)ViewState["StudentObject"];   

    怎么跟踪view state信息?

    如果想跟踪view state信息, 通过Page指令的Trace属性为true。

    1. <%@ Page Language="C#" Trace="true"   

    运行web应用程序。你将在树状控件区看到控件ID,和ViewState大小等详细信息。不要担心"Render Size Byte" , 它是控件的大小。

     ViewState探索

    启用或禁止View State

    你可以启用或禁止单个控件View state,也可以启用或禁止页面级别的View State.设置控件EnableViewState属性false,可以关掉单个控件的View State.例如:

    1. TextBox1.EnableViewState =false;  

    通过Page指令的EnableViewState属性为false.关闭整个页面的View State.

    1. <%@ Page Language="C#"  EnableViewState="false"   

    即使禁止了整个页面的View State.你将看到在隐藏的view state标签中仍然保存少量信息。这是因为ASP.NET一直最少量的保存控件的层级关系信息。即使View State被关闭了。

    为了启动View State,你需要把相应的数据设置为True.下面是一个启动单个控件View State的例子:

    1. TextBox1.EnableViewState =true;  

    启动页面级别ViewState的例子:

    1. <%@ Page Language="C#"  EnableViewState="true"  

    怎么保证View State的安全性?

    我已经说了View State信息是以Base64字符串编码保存在隐藏域中。它看起来象:

    ViewState探索


    许多ASP.NET程序员以为这是被加密的格式。我再说一次,这不是加密的字符串,它很容易被破解。为了确保View State的安全,可以进行两个设置:
        *      首先,你要确保View State信息使用"hash code"防干扰的。 可以通过Page指令 EnableViewStateMAC属性为true. MAC 代表"Message Authentication Code"

     

    1. <%@ Page Language="C#" EnableViewState="true" EnableViewStateMac="true"   


    hash code(保密性强的校验)由ASP.NET计算出。被附加到View State内容中保存于隐藏域。再下次PostBack时,那个校验码被验证。如果有错误,Post Back将被拒绝,我们也可以再web.config中设置该属性。

    转载:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/86b6adb6-fd7e-48ed-975a-1c262c586202.htm



        *      第二个设置是:通过Page指令ViewStateEncryptionMode属性为Always。这将加密View State数据。如下设置:

     

    1. <%@ Page Language="C#" EnableViewState="true" ViewStateEncryptionMode="Always"  

    ViewStateEncryptionMode 有三个可选项:

        * Always
        * Auto
        * Never
    Always意味着View State一直被加密。Never意味者从来不加密。Auto意味着对特别指定的控件加密,该控件必须调用Page.RegisterRequiresViewStateEncryption()方法请求加密。

    也可以在web.config中设置 "EnableViewStateMAC" 和 ViewStateEncryptionMode"

    1. <system.web>  
    2.   <pages viewStateEncryptionMode ="Always"  
    3.           enableViewStateMac ="true"/>  
    4. </system.web>  

    注意 : 避免不必要的加密。因为这导致性能问题。

    一些重要点

    问题回答
    客户端还是服务器端 客户端
    是否使用服务器资源
    是否易于实现
    是否有性能问题 对于大数据,加密,解密会有
    支持加密解密? 支持
    能存储对象? 可以。但需要在类上加serialize关键字
    会超时吗? 不会
  • 相关阅读:
    MF研究:TinyCLR运行时原理
    不到600美元,即可获取一套MF Porting kit 3.0
    SideShow Gadget开发[1]
    我眼中的WinHEC大会台前幕后
    Visual C++ 2008入门经典 第四章数组 字符串(二) 简单
    PHP的常用函数 简单
    Visual C++ 2008入门经典 第五章程序结构(二) 简单
    用PHP将Unicode 转化为UTF8 简单
    sql GROUP_CONCAT(... SEPARATOR) 简单
    Visual C++ 2008入门经典 第四章数组 字符串(练习题) 简单
  • 原文地址:https://www.cnblogs.com/tianma3798/p/3708106.html
Copyright © 2020-2023  润新知