隐藏域其实是html网页代码中的隐藏类表单的标签,可以在里面写入值集,但在网页表面上是不会显示出来的。具体形式<input type="hidden" name="" id="" value="123456"/>。
可见type="hidden"就表示它是隐藏域,在value中保存一些值集,通过name、id或其他方式进行获取和修改。
它有很多作用例如:传值、安全,都会用到的,当你缺什么值就可以在页面隐藏传值,页面不显示。功能与其他的input一样,只不过用户不能直接看见,用来辅助服务器完成一些动作。
隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或发送信息,以利于被处理表单的程序所使用,下面为大家详细介绍下此隐藏域在实际中时如何使用的:
基本语法:
<input type="hidden" name="field_name" value="value">
作用:
1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或发送信息,以利于被处理表单的程序所使用。浏览者单击发送按钮发送表单的时候,隐藏域的信息也被一起发送到服务器。
2 有些时候我们要给用户一信息,让他在提交表单时提交上来以确定用户身份,如sessionkey,等等.当然这些东西也能用cookie实现,但使用隐藏域就简单的多了.而且不会有浏览器不支持,用户禁用cookie的烦恼。
3
有些时候一个form里有多个提交按钮,怎样使程序能够分清楚到底用户是按那一个按钮提交上来的呢?我们就可以写一个隐藏域,然后在每一个按钮处加上onclick="document.form.command.value="xx""然后我们接到数据后先检查command的值就会知道用户是按的那个按钮提交上来的。
4 有时候一个网页中有多个form,我们知道多个form是不能同时提交的,但有时这些form确实相互作用,我们就可以在form中添加隐藏域来使它们联系起来。
5 javascript不支持全局变量,但有时我们必须用全局变量,我们就可以把值先存在隐藏域里,它的值就不会丢失了。
6 还有个例子,比如按一个按钮弹出四个小窗口,当点击其中的一个小窗口时其他三个自动关闭.可是IE不支持小窗口相互调用,所以只有在父窗口写个隐藏域,当小窗口看到那个隐藏域的值是close时就自己关掉。
隐藏域---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始终参与
往返,而且序列化和反序列化会消耗一定资源,因此,存储过大的数据会导致网页加载过慢,浪费服务器带宽