科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET服务器控件之视图状态

ASP.NET服务器控件之视图状态

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

为Web页面及其控件保持状态信息是非常有必要的。然而,由于Web应用程序创建于HTTP协议的顶层,这是一个无状态的协议

作者:金属边缘 来源:天极开发 2007年11月6日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
典型应用

  在利用ASP.NET 2.0技术进行服务器控件开发过程中,有很多方面可以用到视图状态。常见的是利用ViewState字典实现服务器控件属性。ViewState是System.Web.UI.StateBag类型-一个键/值对的字典,服务器控件的属性值可以存储在ViewState中。下面通过一个典型示例,说明ViewState的应用方法。

  在自定义服务器控件LabelInViewState中,实现了两个属性Text和TextInViewState。前者使用私有变量创建,后者使用ViewState实现。它们都用于获取或者设置文本内容。自定义控件实现文件LabelInViewState.cs源代码如下所示。

using System;using System.Collections.Generic;
using System.ComponentModel;using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace WebControlLibrary{
 [DefaultProperty("Text")]
 [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")]
 public class LabelInViewState : WebControl {
  private string _text; //实现Text属性
  public string Text {
   get {
    return (_text == null) ? string.Empty : _text;
   }
   set { _text = value; }
  }
  //使用ViewState实现TextInViewState属性
  public string TextInViewState {
   get {
    String s = (String)ViewState["TextInViewState"];
    return ((s == null) ? String.Empty : s);
   }
   set { ViewState["TextInViewState"] = value; }
  }
  // 重写RenderContents方法
  protected override void RenderContents(HtmlTextWriter output) {
   output.Write("Text = ");
   output.Write(Text);
   output.Write("<br/>");
   output.Write("TextInViewState = ");
   output.Write(TextInViewState);
  }
 }
}

  如上代码所示,控件实现了两个属性Text和TextInViewState。Text属性使用了私有变量_text创建,这种实现无法保持该属性的状态信息。TextInViewState属性使用了ViewState,其通过set访问器,将属性值写入ViewState["TextInViewState"]对象中,通过get访问器,从对象ViewState["TextInViewState "]中获取属性值。这就是视图状态处理最简单的方法。当使用ViewState作为属性存储时,自定义服务器控件可以自行完成简单的状态信息管理,例如,TrackViewState、SaveViewState、LoadViewState等。当然,开发人员也可以通过重写方法自定义状态管理逻辑程序。在本例中,视图状态管理过程都是由.NET框架自动完成的。

  下面列举了为测试以上自定义服务器控件而创建的Default.aspx文件源代码。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
 void Button1_Click(object sender, EventArgs e) {
   demoLabel.Text = TextBox1.Text;
   demoLabel.TextInViewState = TextBox2.Text;
 }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>使用视图状态ViewState</title>
</head>
<body style="font-size: small;">
<form id="form1" runat="server"> <div> 姓名:

  以上代码显示在页面中包括两个文本框,两个按钮,以及一个自定义服务器控件LabelInViewState。如事件处理程序Button1_Click所示,当单击"提交"按钮时,LabelInViewState控件将获取文本框中文本,并显示出来。应用程序效果图如图1和图2所示。


图1 单击提交按钮

图2 单击重载按钮

  如图1所示,当用户在两个文本框中填写了文本,并单击"提交"按钮引发页面回传。此时,填写的文本内容将提交到服务器,并参与Button1_Click事件处理程序。这样,LabelInViewState控件则显示出了Text和TextInViewState属性值。之后,当用户单击"重载"按钮时,文本框内容仍然提交到服务器,但是,由于没有对应的事件处理程序,因此,LabelInViewState控件只显示已经存在的状态信息(即单击提交按钮之后保存的状态),即Text属性值为空,而TextInViewState属性值为tom@tom.com。通过以上过程可知,TextInViewState属性值都存储在视图状态ViewState中,因此,在页面往返过程中,该属性值得以保持,而Text只简单使用了私有变量,所以状态信息无法保持。另外,需要注意的是,由于默认情况下,页面启用了视图状态EnableViewState = "true",才能实现以上效果。

  小结

  本文主要介绍了视图状态的基本概念,并通过一个典型示例说明了应用方法。可能部分读者已经认识到,如果禁用了页面或者控件的视图状态,即设置EnableViewState = "false",那么上文服务器控件的属性TextViewState不是不能使用了吗?这的确是视图状态的缺陷所在。然而,这并不是说就无法解决这个问题了。在下文中,笔者将介绍另外一种ASP.NET 2.0新增的,与视图状态极为类似的技术特性--控件状态--它就能够很好的解决禁用视图状态的问题。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章