黑马程序员技术交流社区

标题: viewstate和隐藏域是一回事吗? [打印本页]

作者: 职业规划-蔡红微老师    时间: 2012-4-10 18:37
标题: viewstate和隐藏域是一回事吗?
viewstate和隐藏域是一回事吗?这个怎么使用啊?
作者: 王宗伟    时间: 2012-4-10 19:59
不是哦!viewstate是隐藏域 的一部分,请看下面资料

隐藏域---ViewState---ControlState----->保存数据的另一个场所

1.使用隐藏域

  除了Session、Application和Cache可以保存数据外,那还有哪里可以让我们暂时保存数据呢?那就是页面!我们可以设置一个控件隐藏,那我们就可  以用这个控件来保存一些临时数据,供当前页面的程序使用
  
  同时,我们还可以使用隐藏域来进行类似的工作,但在隐藏域中填写的内容不会直接显示在IDE的设计视图中,代码如下:
  <asp:HiddenField ID="HiddenField1" runat="server" Value="编程快乐"/>

  在代码中可以直接访问隐藏域的Value属性获得其值:
  Response.Write(HiddenField1.Value);

  不过,这样做有几个不合理的地方:
  数据直接暴露给用户、只能存储字符串数据


2.使用ViewState(视图状态)

  ViewState主要是用来存放和视图有关的一些状态,ASP.NET通过ViewState自动保存控件的状态,同时,我们也可以利用ViewState来保存一些程序需  要的数据,ViewState中的数据默认是使用base64进行编码的,因此,用户不能直接看到里面的数据

  在代码中添加一个ViewState项:  ViewState["test"]="编程快乐";
  查看源代码:<input type="hidden" name="_VIEWSTATE" id="_VIEWSTATE" value="xt+q3cdaffdsaefcsaesefdserfs">

  既然ViewState是存在页面上,那么ViewState则不能跨页使用,每个用户访问到得ViewState都是独立的,另外,页面在ViewState就在,页面关闭  ViewState就关闭

  
3.ViewState的安全与性能

  保证安全性:保证客户端提交过来的ViewState没有被修改、保证用户不能直接看到ViewState中的数据(加密)

  对ViewState进行验证和加密:
  <%@ Page Language="C#" EnableViewStateMac="true" ViewStateEncryptionMode="Always"%>

  如果要对所有页面进行ViewState的验证和加密,可以在Web.config的system.Web节点中添加:
  <pages enableViewStateMac="true" ViewStateEncryptionMode="Always"></pages>

  既然ViewState中的数据时序列化后加入的,那么我们就可以把一些复杂的类型(比如类)存放到ViewState中,比如:
  MyUser user=new MyUser("小猪",20);
  ViewState["CustomClass"]=user;

  读取代码:
  MyUser user=ViewState["CustomClass"] as MyUser;

  ViewState中尽量保存少量的数据,如果实在需要在ViewState中放置大量的数据建议使用maxPagesStateFieldLength对ViewState启用分块传输:
  <%@ Page Language="C#" maxPageStateFieldLength="100"%>

  ASP.NET会把控件交互相关的一些数据都存放到ViewState中,但是对于一些不识闲任何交互的控件,可以设置控件的EnableViesState属性为false来  让控件不适用ViewState,从而减少页面体积



4.ControlState
  用于保存(自定义)控件的关键信息
  就算页面或者控件的ViewState被关闭它还能起作用,弥补了ViewState能被禁止的不足
  但是使用ControlState稍显复杂,我们需要自己序列化复杂对象进行存储

  在ControlState中保存和读取简单字符串的代码:
     PageStatePersister.ControlState="编程快乐";
     Response.Write(PageStatePersister.ControlState.ToString());

5.对隐藏域、ViewState和ControlState的总结
  
    存储的物理位置:表单隐藏域
    存储的类型限制:可序列化类型(直接在隐藏域中保存内容需要自己序列化)
    状态使用的范围:当前页面(当前控件),对用户独立
    存储的大小限制:存储过大数据会导致页面不能正常打开,不能正常提交
          生命周期:页面在就在,页面不在就不在了,三者始终是衣服在页面的隐藏域中
        安全与性能:在客户端存储,安全性低,不过,ViewState提供了验证和加密
  优缺点与注意事项: 存储少量数据非常方便简单,但需要注意不要存储敏感数据,不要存储过大数据,隐藏域、ViewState和ControlState始终参与                   往返,而且序列化和反序列化会消耗一定资源,因此,存储过大的数据会导致网页加载过慢,浪费服务器带宽








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2