快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
InControlState); }
} else { return obj; }
  }
  //重写LoadControlState方法,加载控件状态数据
  protected override void LoadControlState(object state) {
if (state != null) {
  Pair p = state as Pair;
  if (p != null) {
base.LoadControlState(p.First);
_indexInControlState = (int)p.Second;
  } else {
if (state is int) {
  _indexInControlState = (int)state;
} else { base.LoadControlState(state); }
  }
}
  }
}
  }

如上代码实现了一个继承自Button基类的IndexButton控件,其中包括属性IndexControlState和IndexInViewState。根据代码实现可知,IndexInViewState属性利用了视图状态来存储值,而Index属性利用了控件状态来存储值。前者的实现非常简单,在此不再说明。后者的实现主要通过完成以下三个步骤,才使控件参与控件状态。

(1)重写OnInit方法并调用RegisterRequiresControlState方法向页面注册,以参与控件状态。需要注意的是:必须针对每个请求完成此任务。

(2)重写SaveControlState方法,以在控件状态中保存数据。

(3)重写LoadControlState方法,以从控件状态加载数据。此方法调用基类方法,并获取基类对控件状态的基值。如果_indexInControlState字段不为零,而且基类的控件状态也不为空,Pair类便可作为方便的数据结构使用,用来保存和还原由两部分组成的控件状态。

读者可以回想一下前一篇介绍视图状态文章中的示例。其中同样也定义了两个属性,一个是采用视图状态构建的TextInViewState属性,另一个是使用私有变量实现的Text属性。前者TextInViewState属性与上文示例中的IndexInViewState属性的实现方法几乎完全相同,其无非是利用ViewState存储属性值而已。然而,后者Text属性与上文示例的IndexInControlState属性虽然有些类似,例如,二者在实现过程中都使用了私有变量,但是,二者的本质不同。Text使用的是私有变量,而IndexInControlState使用的是控件状态,其关键是通过OnInit方法启用了控件状态功能,并重写SaveControlState和LoadControlState方法,以便自定义控件状态数据的保存和加载过程。建议读者在阅读本文的同时,也能够注意到本段所述内容。这对于理解视图状态和控件状态概念有着重要意义。

下面列举了为测试IndexButton控件而创建的Default.aspx页面源代码。

<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="WebControlLibrary" Namespace="WebControlLibrary" TagPrefix="aspSample" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
  Label1.Text = (IndexButton1.IndexControlState++).ToString();
  Label2.Text = (IndexButton1.IndexInViewState++).ToString();
}
</script>
<!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> 请单击该按钮: <aspSample:IndexButton Text="IndexButton" ID="IndexButton1" runat="server" />
<br /> <br />
Index属性值是: <as

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号