viewState解密

1.ViewState通过隐藏域来实现。
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJODcwNjAxNTI1ZGTufnJfEo1sLgYMY3lPKRptx+ebENdvpDgck5vqKvVLvg==" />
2.ViewState是服务器端为了保持用户的状态信息而创建的一种机制,所以ViewState只会应用于服务器端控件。(只有使用了服务器端表单或服务器端控件时才会自动产生ViewState。)一般用来保存服务器端控件的状态。
3.不是所有的元素都会记录ViewState信息,也不是所有的服务器端控件都会记录ViewState信息,asp.net会根据需求来选择记录某些控件的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="/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATBkZGQHx94b8VXnJ3QTOcyQ2gM/qme6s7sGZPT+Thk8fqFDgw==" />
</div>

<div class="aspNetHidden">

	<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="DBC4925F" />
	<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAALsHWcNMonzwDOLWj7/9QYVzfg78Z8BXhXifTCAVkevd0yXDRULO5UzsYA2fNTFUwqWyvp+ZNtJ0SmOMXTH8pgm" />
</div>
    <div>
      
       
        <span id="Label1">0</span>
    </div>
    <input type="submit" name="Button1" value="自增" id="Button1" />
    </form>
</body>
</html>

什么是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="自增" οnclick="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();
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值