ASP.NET状态引擎

  1. 状态的定义及其重要性

    http是无状态的,Web服务器不会跟踪从特定浏览器中发出的请求,每个请求都是相互独立的。现假设页面有两个文本框和一个按钮用于登录功能,假设用户输入了正确的用户名和错误的密码进行登录,那么页面会通知此次登录失败,这时用户会希望登录失败后页面已经自动填写好了用户名而不希望再重新输入,然而默认情况下,Web页面或控件不会自己完成这一切,由于每个请求都是独立的请求,因为服务器不会在回发之后再次填充文本框,而是简单地以它首次加载页面时的方式处理页面。

  2. 状态引擎的表现

    在页面有两个Button(SetDateBtn&PlainPostBackBtn)和一个Label(DateLabel)控件,SetDateBtn用于定义DateLabel的时间,PlainPostBackBtn仅仅是触发一个回发不进行任何操作。

        <form id="form1" runat="server">
        <div>
           <table>
               <tr>
                   <td>
                       <asp:Label ID="dateLabel" runat="server" text="label" />
                   </td>
                   <td>
                       <asp:Button ID="setDateBtn" runat="server" Text="SetDate" OnClick="setDateBtn_Click" />
                   </td>
               </tr>
               <tr>
                   <td></td>
                   <td>
                       <asp:Button ID="plainPostBackBtn" runat="server" Text="PlainPostBack" OnClick="plainPostBackBtn_Click" />
                   </td>
               </tr>
           </table>
        </div>
        </form>
            protected void setDateBtn_Click(object sender, EventArgs e)
            {
                dateLabel.Text = DateTime.Now.ToString();
            }
    
            protected void plainPostBackBtn_Click(object sender, EventArgs e)
            {
    
            }

    当单击SetDateBtn时Label控件会显示当前时间,当单击PlainPostBackBtn时,Label控件显示的文本会保持不变,这时因为ASP.NET状态引擎保存了label的状态。但是当设置Label的EnableViewState为false关于控件状态时,单击PlainPostBackBtn时,Label控件会显示为它当初原本的值label。

  3. 状态引擎的工作原理

    HTML<form>元素用于让用户从浏览器向服务器提交信息,表单的提交方式有两种:post 或 Get,Post方法用于将数据添加到请求的主体中而Get方法则是将数据附加到请求页面的地址上,重要的是它用于封装一些表单控件,这些控件的值会被一起提交回服务器。当单击Button类似的能导致回发的控件时,会导致向服务器发送一个回发,在这个回发期间,表单中的所有相关信息都会被提交回服务器,在服务器上可以用来重构页面。接下来介绍隐藏的_VIEWSTATE字段

    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="rytxNjmgeUfRTDvTz0MXBkDTivGfdY+sfR2XlbkklBGfJApqC5qqwozufCgZ61cEg/v5JWvpQs7uqgjMK0VFqD8kVjpwh8UMawvI//4cCok=" />

    为了保护存储在这个字段中的信息以及为了缩小它的大小 ,ASP.NET会进行特殊处理。当加载ASP.NET页面时,所有控件都包含它们的默认值,在设置默认值后不久,运行库会用它在View State中找到的值覆盖控件的这些默认值。在页面触发一个回发修改控件的值时,ASP.NET运行库会看到这个变化,并将新值存储到View Sate中,因此它对于以后的回发仍然是可用的。但是并非所有的控件都一直依赖于View State,有很多的控件能维持它们自己的某些状态。比如TextBox、CheckBox、RadioButton和DropDownList。

  4. 关闭状态引擎

    由于View State引擎会给页面添加相当数量的信息,因此在不需要时最好关闭它,这个就能最小化隐藏的_VIEWSTATE字段的大小 ,这意味的页面会变得较小,因而在浏览器中加载时就会较快。  

    1. 在Web站点级别关于View State  
       <system.web>
          <pages enableViewState="false">
          </pages>
       </system.web>
    2. 在页面级别
      <%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" CodeBehind="ControlWebForm.aspx.cs" Inherits="控件学习.ASP.NET服务控件.ControlWebForm" %>
    3. 在控件级别
       <asp:Label ID="dateLabel" runat="server" EnableViewState="false" / >  
    4. 一旦在一个更高级别上关闭View State,就不能再在一个低层级别中打开这个功能,然后,使用新的ViewStateMode属性仍然完成如下工作:
      1. 禁止在Web.config文件中关闭View State.
      2. 在页面级别,将EnableViewState设置为True,将ViewStateMode设置为Disabled.这样可以关闭页面中所有控件的View State,除非那些再次明确地将ViewStateMode属性设置为Enabled的控件以外。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。