文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>初探ViewState

初探ViewState

时间:2011-05-14  来源:wjwcq

 Web 本质上是无状态的;对页面的每个请求都将被视为新请求,而且默认情况下,来自一个请求的信息对下一个请求不可用,而ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。_VIEWSTATE中存放了所有控件在ViewState中的状态值。 当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。

下面用简单的例子来分析一下:实现数据自增

在分析例子之前我们要知道:在向服务器提交表单的时候,并不是表单中的所有标签都提交,只有那些带有Name标签才可以提交到服务器的,像<p> <span>标签是不会提高给服务器。原因很简单我们的在后台通过Request对象请求数据的时候就是通过Name属性来取得,比如:

在div中放一个html标签:注意此时input标签是没有name属性为空

1 <input id="txtUserName" type="text"  />
2 <asp:Button ID="Button1" runat="server" Text="登陆" onclick="Button1_Click" />

在button的click函数为:

 1  protected void Button1_Click(object sender, EventArgs e)
2 {
3 string UserName = Request["UserName"];//获得代码Name为UserName的标签
4 if (UserName == null)//要是此标签不存在就为空
5 {
6 Response.Write("null");//输出提示信息
7 }
8 else//否则就可以取到此标签的值
9 {
10 Response.Write(UserName);//输入登录者
11
12 }
13
14
15 }

运行结果如下:

但是要是给input标签添加name属性的值

1        <input id="txtUserName" type="text"  name ="UserName" />
2 <asp:Button ID="Button1" runat="server" Text="登陆" onclick="Button1_Click" />

运行结果是:

通过上面的例子我们可以知道,我提交表单的时候只有代码name值的标签才可以再提交给服务器,在后台才可以处理这些标签。

下面正式开始我们的例子

在div中添加如下代码:

1  <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
2 <asp:Button ID="Button1" runat="server" Text="lab自增" onclick="Button1_Click" />
3 <br />
4
5 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
6 <asp:Button ID="Button2" runat="server" Text="txtB自增" onclick="Button2_Click" />

然后再后台添加如下代码:

 1 protected void Page_Load(object sender, EventArgs e)
2 {
3 if (!IsPostBack)//实现初始化
4 {
5 Label1.Text = "0";
6 TextBox1.Text = "0";
7
8 }
9 }
10
11 protected void Button1_Click(object sender, EventArgs e)
12 {
13 int i = Convert.ToInt32(Label1 .Text );//取出之前label的值
14 i++;//自增
15 Label1.Text = i.ToString();//然后把自增后的值重新赋值给label
16 }
17
18 protected void Button2_Click(object sender, EventArgs e)
19 {
20 int i = Convert.ToInt32(TextBox1 .Text );//取出textbox的值
21 i++;//自增
22 TextBox1.Text = i.ToString();//然后把自增后的值重新赋值给textbox
23
24 }

分别点击两个自增按钮时候,数据每次有增加一:

此时我们查看源代码:

 1 <body>
2 <form name="form1" method="post" action="Default.aspx" id="form1">
3 <div>
4 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA5NTQxNTQ2MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATRkZGQzwhq6OMthX/9S/oc1DhXcE2Nnzg==" />
5 </div>
6
7 <div>
8
9 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAL/oMO/CwKM54rGBgLs0bLrBgK7q7GGCI3r57IqYGQLgOa3APwkK5sSslD4" />
10 </div>
11 <div>
12
13 <span id="Label1">4</span>
14 <input type="submit" name="Button1" value="lab自增" id="Button1" />
15 <br />
16
17 <input name="TextBox1" type="text" value="5" id="TextBox1" />
18 <input type="submit" name="Button2" value="txtB自增" id="Button2" />
19 </div>
20 </form>
21 </body>

      我们发现服务器端得label标签到客户端给渲染成了<span>标签(没有name属性值),而textbox给渲染成带有name属性值的input标签。同时还发现两个隐藏字段__VIEWSTATE和__EVENTVALIDATION。通过上面的分析知道<span>标签是不会提交给服务器的,而在点击函数里

protected void Button1_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt32(Label1 .Text );//取出之前label的值
            i++;//自增
            Label1.Text = i.ToString();//然后把自增后的值重新赋值给label
        }

却取到了label1的值,这是为什么???这是其实_VIEWSTATE保存了这个值,说到这,想必你一定想看看这个viewstate里面到底存了哪些东西

我们用viewStateDecode工具查看这个_VIEWSTATE的值:

从上面的运行结果来看,label的值是4,textbox的值是5,这是运行后的结果,在点击之前,label的值是3和textbox的值是4,此时的viewState的值也是3和4,当点击自增后

在后台取出viewState的值,然后再分别自加,所以显示的是4和5。

我们也发现在后面明明取得是label的值 :int i = Convert.ToInt32(Label1 .Text );//取出之前label的值,但这个值不是传递不到的服务器?为什么还以取到?因为label是服务器控件,我们在后台是可以取到的,至于这个label的值我猜想在提交表单的时候,后台做了一个类似于绑定的工作,把viewState的值赋值给label。这是我个人想法,要是不对请高手赐教。

从上面的分析我们可知, viewstate用来保存状态,包括页面本身, 那么,这里的viewstate就属于页面本身的状态.

分析到此,估计大家对viewstate的使用应该是没有什么疑问了。

还有一一点就是我们可以禁止viewstate,禁止viewstate的方法是: EnableViewState ="false"

那么上面程序中点击lab自增按钮label的就不会增加。而此时textbox的值还是可以的,原因就是上面的提到的:

label标签到客户端给渲染成了<span>标签(没有name属性值),而textbox给渲染成带有name属性值的input标签,只有代码name值的标签才可以再提交给服务器,在后台才可以处理这些标签。input标签同样可以在后台操作(textbox是不依赖ViewState),laber标签就不行了(没有隐身字段VeiwState为其保存值)。

呵呵,至此,对viewstate应该有个很清晰的认识了, 不过,初步研究viewstate, 理解有误之处还望大家多指教

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载