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

分类: asp.net技巧   出处:iocblog整理  更新时间:2008-08-28   添加到收藏  

  在利用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> 姓名:xml:namespace prefix = asp />

  以上代码显示在页面中包括两个文本框,两个按钮,以及一个自定义服务器控件labelinviewstate。如事件处理程序 button1_click所示,当单击"提交"按钮时,labelinviewstate控件将获取文本框中文本,并显示出来。应用程序效果图如图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新增的,与视图状态极为类似的技术特性--控件状态--它就能够很好的解决禁用视图状态的问题。

上一页 [1] [2]



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。