首页 > 代码库 > viewState解密

viewState解密

viewState.aspx页在没有禁用掉viewState时候的HTML源码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
    <form method="post" action="viewState.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=http://www.mamicode.com/"/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATBkZGQHx94b8VXnJ3QTOcyQ2gM/qme6s7sGZPT+Thk8fqFDgw==" />>

什么是viewState: viewState其实就是用来存放数据的一个容器。[主要存放那些没有name 属性且没有value属性,或者有name属性,但是保存那些非value值的表单属性值] 如div的text值 或者input 中的button 表单的width,height属性值,

viewState.aspx代码

<%@ Page Language="C#" EnableViewState="false"  AutoEventWireup="true" CodeBehind="viewState.aspx.cs" Inherits="WebApplication2.viewState" %>
 <%--EnableViewState="false" 的意思是禁用viewState;如果去掉EnableViewState="false"默认就是启用viewState--%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      
       <%-- Label.Text的初始值为 Label--%>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>
    <asp:Button ID="Button1" runat="server" Text="自增" onclick="Button1_Click" />
    </form>
</body>
</html>


viewState.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class viewState : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) //如果页面是第一次加载(也就是说页面不是通过提交数据(点击button按钮)的形式而加载的)那么就将Label的Text值设为0; 
            {
                Label1.Text = "0";
            }
            else
            {
                Label1.Text = Label1.Text;
            }
            
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //Console.WriteLine(Label1.Text);
            int i = Convert.ToInt32(Label1.Text);//【在没有禁用viewState的情况下】当第一次进入http://localhost:5045/viewState.aspx页面的时候,因为是第一次进入页面,所以在Page_Load方法里面已经将Label1.Text的值 由最初始的"Label"改设为"0"了。所以当用户点击“提交”按钮,触发onClick事件来调用 Button1_Click方法,此时的i=0; 因为用户在没有禁用viewState的情况下,Label的Text值(0)存在 一个隐藏的表单 hidden的value值里。所以此时的Label1.Text的值为0  ,即int i的值为0了

            //【在禁用viewState的情况下】当第一次进入http://localhost:5045/viewState.aspx页面的时候,因为是第一次进入页面,所以在Page_Load方法里面已经将Label1.Text的值 由最初始的"Label"改设为"0"了。当用户点击“提交”按钮,触发onClick事件来调用 Button1_Click方法,此时的Label.Text=Label1; 因为用户在禁用viewState的情况下,Label的Text值(0)已经无法存储在一个隐藏的表单 hidden的value值里了。所以,即便你(用户)在第一次进入页面后,将Label1.Text的值设为0后,在我重新取Label1的Text的值后,获取到的依然为最初始的"Label1",因为你新设的“0”如果不能放到隐藏表单hidden的value值存起来,下次再用的时候我就不知道你最新的值到底是多少,我只知道我最原始的值“Label1”  所以此时的Label1.Text的值为Label1  ,因为int i无法将"Label1"转换成一个int 类型,所以这里就会报错了。
            i++;
            Label1.Text = i.ToString();
        }
    }
}