Share

在ASP.NET框架中支持在回传中保存值的有2种方式:视图状态和控件状态

视图状态

ASP.NET中几个对象属性与控件最为密切的,就是ViewState了。

这里对其做下说明,任何可序列化类的实例均可添加到视图状态中,但是实际上,如果添加到名为_ViewState的隐藏表单域变的太大,会影响页面执行效率。

下面定义的控件包含了Text和ViewStateText属性,只有后者使用视图状态,那么ViewStateText属性的值会在页面回传中保存。

namespace ViewStateControl
{
    /// <summary>
    ///支持视图状态
    /// </summary>
    public class SupportViewStateControls : WebControl
    {
        public string Text
        {
            get;
            set;
        }
        public string ViewStateText
        {
            get
            {
                if (ViewState["ViewStateText"] == null)
                    return String.Empty;
                else
                    return (string)ViewState["ViewStateText"];
            }
            set
            {
                ViewState["ViewStateText"] = value;
            }
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write("Text:" + Text);
            writer.WriteBreak();
            writer.Write("ViewStateText:" + ViewStateText);
            writer.WriteBreak();
        }
}
    }

上面的代码中ViewStateText属性使用了Control类的ViewState集合在页面回传中保持并赋给ViewStateText属性的值。

在添加一个值到ViewState集合中时,其会自动填充至_VIEWSTATE隐藏表单域

Tip:因为视图状态在页面的InitComplete()后加载,在PreRenderComplete()后保存,也就是说不能在InitComplete()之前检索视图状态或者PreRenderComplete()后添加值至视图状态

控件状态

之所以在ASP.NET中引入控件概念,即使在视图状态被禁用时,仍可以用控件状态将信息保存在_VIEWSTATE隐藏表单域中

这句话很费解,举例来说明:一个GridView中包含了500条记录,为了改善性能,我们可以禁用视图状态,防止其将这些数据填充到_VIEWSTATE域里,

但是对于当前页数及选中的记录,我们仍希望GridView记住这些信息,这时就用到了控件状态。

namespace ViewStateControl
{
    /// <summary>
    ///支持控件状态
    /// </summary>
    public class SupportControlStateControls : WebControl
    {
        public string ViewStateText
        {
            get
            {
                if (ViewState["ViewStateText"] == null)
                    return String.Empty;
                else
                    return (string)ViewState["ViewStateText"];
            }
            set
            {
                ViewState["ViewStateText"] = value;
            }
        }
        private string _controlStateText;
        public string ControlStateText
        {
            get
            {
                return _controlStateText;
            }
             set
            {
                _controlStateText = value;
            }
        }
        protected override void OnInit(EventArgs e)
        {
            Page.RegisterRequiresControlState(this);
            base.OnInit(e);
        }
        protected override object SaveControlState()
        {
            return _controlStateText;
        }
        protected override void LoadControlState(object savedState)
        {
            _controlStateText = (string)savedState;
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write("ViewStateText:" +ViewStateText);
            writer.WriteBreak();
            writer.Write("ControlStateText:" + ViewStateText);
            writer.WriteBreak();
        }
 }
    }

这个代码用ViewStateText表示视图状态,ControlStateText属性表示控件状态,在OnInit()中RegisterRequiresControlState方法被调用指定该控件需要利用控件状态。SaveControlState和LoadControlState事件负责保存加载控件状态。

运行

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestStateControl.aspx.cs" Inherits="TestViewStateControl" %>
<%@ Register TagPrefix="states" Namespace="ViewStateControl" %>
<!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>
    <states:SupportControlStateControls ID="SupportControlStateControls1" EnableViewState="false" runat="server" />
    <asp:Button ID="Button1" runat="server" Text="Button" />
    </div>
    </form>
</body>
</html>
后台代码:
 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SupportControlStateControls1.ViewStateText = "Hello";
            SupportControlStateControls1.ControlStateText = "Hello";
        }
    }

因为EnableViewState属性被关闭,所以单击按钮时,只有ControlStateText的属性值不会丢失

本文参考了《ASP.NET 3.5 揭秘(卷2)》

转载于:https://www.cnblogs.com/626498301/archive/2010/07/25/1784709.html

自定义控件的构建(5)相关推荐

  1. 自定义控件的构建(12)

    Share 前面讲了模板的构建,我们忽略了一个细节,如果接触ASP.NET时间不长的话,一般都会看到数据表达式是<%#Eval('Name')%>这种形式的, 那么我们为什么用<%# ...

  2. 自定义控件的构建(10)

    Share 通过前面一系列的改进,我们已经可以初步构建出一个功能相对比较全面的控件了,那么,本篇关注一下我们一直忽略的地方,即如何在VS设计器中显示. 设计器体验 这主要有两种方式:控件设计时特性与关 ...

  3. [转]决定何时使用 DataGrid、DataList 或 Repeater

    摘要:了解 ASP.NET 用于显示数据的三个控件: DataGrid.DataList 和 Repeater. 这些控件中的每一个都有独特的特性以及相关的优点和缺点. 创建显示数据的 ASP.NET ...

  4. Unity从零开始构建能力体系 Unity Ability System

    从零开始构建能力体系 你会学到什么 如何实施能力体系 如何使用用户界面工具包创建用户界面 如何使用Unity的GraphView API 如何实现保存系统 MP4 |视频:h264,1280×720 ...

  5. PropertyGrid自定义控件

    PropertyGrid是一个很强大的控件,使用该控件做属性设置面板的一个好处就是你只需要专注于代码而无需关注UI的呈现,PropertyGrid会默认根据变量类型选择合适的控件显示.但是这也带来了一 ...

  6. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    原文:Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必 ...

  7. XamarinForms教程构建XamarinForms开发环境

    构建XamarinForms开发环境 所谓Xamarin.Forms的开发环境,就是指在基本硬件和数字软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE.对于任何的程 ...

  8. 教你如何 构建基本的用户控件

    创建一个简单用户控件是开始自定义控件的好方法.本章主要介绍创建一个基本的颜色拾取器.接下来分析如何将这个控件分解成功能更强大的基于模板的控件. 创建基本的颜色拾取器很容易.然而,创建自定义颜色拾取器仍 ...

  9. Android 自定义控件开发入门(一)

    那么怎样来创建一个新的控件呢? 这得看需求是怎样的了. 1.需要在原生控件的基本功能上进行扩展,这个时候你只需要继承并对控件进行扩展.通过重写它的事件,onDraw ,但是始终都保持都父类方法的调用. ...

最新文章

  1. 结合实例与代码谈数字图像处理都研究什么?
  2. Responsive设计——meta标签
  3. 函数声明(函数原型)的一些关键技巧
  4. python开发环境wingide的安装与破解
  5. Java Pattern类的用法详解(正则表达式)
  6. C++实现各种排序以及复杂度,稳定性分析
  7. 算法 | 一段C语言和汇编的对应分析,揭示函数调用的本质
  8. UE4 粒子特效基础学习 ——仿英雄联盟亮牌效果(图标触发特效的制作)
  9. 精品H5小游戏源码-免费下载
  10. 中国互联网公司大盘点
  11. 乐吾乐Topology-le5le为智慧电力可视化赋能(一)
  12. java 批量发送邮件_spring boot实现异步批量发送邮件
  13. 不值一提?开源CRM是否值得应用
  14. Canonical Address
  15. 怎么查看计算机办公软件版本的,怎么看电脑office是哪个版本
  16. python 显示字典内容_在pythontkin的标签中显示字典内容
  17. jquery when Deferred
  18. 1.Python下载与安装教程 For Windows
  19. Linux OS7 常用
  20. VLC详细的使用说明以及配置…

热门文章

  1. 待办事项优先级 开发_如何通过创建主题待办事项确定学习内容的优先级
  2. 如何用JavaScript的回调函数做出承诺
  3. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程
  4. was unable to refresh its cache! status = Cannot execute request on any known server
  5. 2018-2019-2 网络对抗技术 20165239Exp3 免杀原理与实践
  6. PXE全自动安装操作系统--centos7.3学习笔记
  7. Java并发编程有多难?这几个核心技术你掌握了吗?
  8. linux发行版的用户交互
  9. 使用Bot Service创建Bot Framework
  10. 润乾报表永久授权说明