最近在做分页控件时发现记录当前索引页都采用ViewState而不采用Session,再一看二者的使用可以说几乎没什么区别,那二者是不是完全等同的呢。再仔细查阅与尝试下发现了二者的区别,很细微的区别,但是确实是我们在开发WEB页面中应该注意的。
session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面. 而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上. 另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期.
但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定义的一些类型.
当然,任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更多的带宽,这一点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值。
以下是我在做分页Repeater控件时的Load代码:
protected void Page_Load(object sender, EventArgs e)
{
BraveboyDataTable = (DataTable)BraveboyRepeater.DataSource; //获得数据源
if (!Page.IsPostBack)
{
CurrentPage = 0;
ViewState["PageIndex"] = 0;
//计算总共有多少条记录
RecordCount = CalculateRecord();
//计算总共有多少页
PageCount = (RecordCount + PageSize - 1) / PageSize;
lblPageCount.Text = PageCount.ToString();
ViewState["PageCount"] = PageCount;
BraveboyBindData();
}
CurrentPage = (int)ViewState["PageIndex"];
PageCount = (int)ViewState["PageCount"];
}
如果没有最后两句
CurrentPage = (int)ViewState["PageIndex"];
PageCount = (int)ViewState["PageCount"];
则每次点击翻页时,CurrentPage、PageCount 就未知的,而用ViewCount就很好的解决了这个问题。
注:其中在每次翻页时会修改ViewState["PageIndex"]的值。