<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ViewState.aspx.cs" Inherits="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>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/* ViewState初控(重点,常考)
* 用asp.net重写div文本自增 (还要同时递增label的宽度,注意width的单位是Unit类型,不是简单的int)
* Lable.Text = (Convert.ToInt32(Label1.Text)+1).ToString();
* Lable.Width = new Unit(Label1.Width.Value + 10)
*
* 查看生成的源代码,ASP.Net将所有隐藏内部统一放到一个名字为_VIEWSTATE的隐藏字段中,使用序列化算法将所有隐藏内容放到一个字符串中
* 点周几次在使用ViewStateDecoder这个工查看ViewState内容,发现了确实半角这些改变的内容放到了ViewState中
*
* 禁用ViewState的方法:enableviewstate=false; 禁用ViewState以后TextBox版本不受影响
* DIV版本受影响应,因为input的value不依靠ViewStae
*/
public partial class ViewState : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //这个是.net自带的
{
Label1.Text = "0"; //页面直接进入的时候赋值0
}
/*else {
string text = Label1.Text;
int num = Convert.ToInt32(text) + 1;
Label1.Text = num.ToString();
}*/
}
protected void Button1_Click(object sender, EventArgs e)
{
string text = Label1.Text;
int num = Convert.ToInt32(text) + 1;
Label1.Text = num.ToString();
}
}
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" CodeFile="ViewStateInput.aspx.cs" Inherits="ViewStateInput" %>
<!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>
<asp:Button ID="Button2" runat="server" style="margin-bottom: 1px"
Text="为Label添加100" onclick="Button2_Click" />
<asp:Label ID="Label1" runat="server" Text="20"></asp:Label>
<br /><br /><br /><br />
<asp:TextBox ID="TextBox1" runat="server">0</asp:TextBox>
<asp:Button ID="Button1" runat="server" EnableViewState="False"
onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//回答ViewState原理的时候: 说input版本(TextBox)自增加和Div版本(Label)的不同
//Label版本的值存到了ViewState中,TextBox版本的不用存,因为TextBox不是input,自已就会提交给服务器,不需要隐藏字段了
//查看生成的源代码,asp.net将所有隐藏内容统一放到了名字为_VIEWSTATE的隐藏字段中,使用序列化算法将所有隐藏内容放到一个字符中中,
//点周几次在使用ViewStateDecoder这个工具查看ViewState内容,发现了确实将这些改变的内容提要放到了
//ViewState中,存储非表单域,非value值的容器
//禁用ViewState的方法:enableviewstate=false
//禁用ViewState以后TextBox版本不受影响,Div版本受影响,因为input的value不依靠ViewState
/* 无状态Http
* Http协议是无状态的,不会记得上次和网页"发生了什么",如果要知道上一次的状态,一个方法是在对浏览器响应结束之前将状态信息保存到而面表单中,下次而面再向服务器发出请求的时候带上这些状态信息
* 这样服务器就能根据这些状态信息还原上次的状态了,类似于去看病的病历本
*
* 状态信息保存在隐藏字段中的缺点: 加大网站的流量,降低访问速度,机密数据放在表单中会有数据欺骗等安全问题
*
*/
public partial class ViewStateInput : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string i = TextBox1.Text;
int num = Convert.ToInt32(i) + 1;
TextBox1.Text = num.ToString();
//修改TextBox1的宽度
TextBox1.Width = new Unit(TextBox1.Width.Value + 10);
}
protected void Button2_Click(object sender, EventArgs e)
{
Response.Write("Label1的值是:"+Label1.Text+"<BR>");
//禁用了ViewState就读不到上次给客户端的值,即使禁用了ViewState,写入到浏览器中的值也不会受影响
Label1.Text = "100";
//即使禁用ViewState在请求没有结束之前也能读出来设置的值
Response.Write("Label1的值是1:" + Label1.Text + "<BR>");
}
}