ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
深入讲解控件的属性持久化(一)
系列文章链接:
ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
自从写了控件开发的文章后,收到了不少朋友的来信,提出了不少的问题,感谢大家的关注。今天就把大家说的一些问
题来讲解下。
虽然我这个系列是控件开发,但是我的目的还是希望大家通过开发控件更加快速的对ASP.NET有更加深入的了解,所以
我们也很有必要把一些基础性的东西将清楚。
为了达到深入讲解属性的目的,我首先来讲讲页面周期和页面解析的一些问题:
1。页面的解析:
大家可能听说,页面在提交给服务器的时候,都是被解析成为了一个个的继承与Page的类,最直接的证明就是:
Code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
大家看看,就是那个代码隐藏
Code
CodeFile="Default.aspx.cs" Inherits="_Default"
大家也许觉得疑惑:一个aspx的页面都是一些标记语言啊,如下面:(注意:是将下面的文本解析为一个类)
Code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!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>
<asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click" /></div>
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
</form>
</body>
</html>
大家也许看见了,上面的源是一个类似与XML的文档。
当这个页面发送到服务器后,服务器就开发用正则表达模式来解析这个文档,比如,看见"<head>"就把他解析为一个
LiteralControl,如:LiteralControl head = new LiteralControl("<head>");,看见了<form>就解析为HtmlForm
类,就这样,一个类似与XML的文档就解析为了一个继承于Page的cs类。如下:(伪码,只是演示而已,真正的不是这样的):
Code
public class Default_aspx :Page
{
//.,
HtmlForm form = new HtmlForm(); Button button1 = new Button();
buton1.Text="提交";
button1.Click+= Button1_Click(object sender, EventArgs e);
//. //.
}
大家注意:页面解析的时候,把我们为控件设置的值,如Text=“ 提交”都初始化给了控件。
然后,将解析完的类生成一个类的实例,之后就开始页面的生命周期。
2.HTTP工作模式
HTTP是一种无状态的连接模式,也就是说,客户端像服务器发送请求职后,服务器响应后就不再维持客户端的信息。
3.综合1,2讲解属性持久化
现在假设,在Button中没有属性持久化这个特点。我们看看下面的流程:
3.1:再页面中放入一个Button按钮,并且设置Text 属性为“提交”,然后再Button的点击Click事件中写下如下
代码:
Code
protected void Button1_Click(object sender, EventArgs e)
{
if (this.Button1.Text == "提交")
this.Button1.Text = "清空";
else
this.Button1.Text = "提交";
}
3.2:将页面提交给服务器,此时,就开始了页面的解析工作,并且在解析的时候,使得Button的Text属性设置为了
“提交”,然后就开始了页面的生命周期。最后页面就呈现在我们面前。
3.3:我们在浏览器的页面中点击Button按钮,页面就再次提交服务器,页面开始解析,然后开始生命周期,在周期的
某一个阶段(以后讲解),就会引发按钮的Click事件,将按钮的文本设置为”清空“,最后页面呈现在我们面前。
3.4;当我们再次点击按钮,我们本来是想使得按钮显示”提交“,但是不管我们点击多少次,按钮总是显示”清空“。
为什么?
因为每次把页面提交的时候,页面解析的结果都是将Button的Text属性设置为”提交“,第二次点击按钮时,按钮的
Text属性显示的是”清空“,但是一旦页面提交后,页面还时按照第一次那样解析,并且初始化。按钮的Click事件还是发现Button的Text为”提交“。因为上次提交后,按钮的Text 属性-”清空“,没有保存(基于Http协议)。
所以为了使得我们可以像 WinForm那样开发,为了使得达到我们想要的效果。ASP.NET中就采用了”保存状态“技术.
4.保存状态技术
其实也很简单,只是每次在页面回传的过程中,把上次的页面的所有设置的状态保存在一个表单字符串"_VIEWSTATE",中,具体是这样的,当页面回到客户端的时候,服务器就把页面中的控件的状态序列化为一个字符串,
一同发给客户端,当客户端提交页面后,服务器就对提交的_VIEWSTATE解析,进行反序列化,然后根据反序列化的结
果,恢复各个控件的状态,这样就得到到上次页面的状态。
然后在页面的生命周期中,如果在控件的事件中有修改控件状态的代码,就在合适的时候引发,然后,再次更新_VIEWSTATE 的值。
这样控件属性的持久化就完成了。
所以我们在开发自定义控件的时候,常常要显示的生命控件属性的持久化。就是用ViewState.
ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性的更多相关文章
- ASP.NET自定义控件组件开发 第五章 模板控件开发
原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl 后篇 --事件冒泡 系列文章链接: ASP.NET ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
- 《深入理解Android 卷III》第六章 深入理解控件(ViewRoot)系统
<深入理解Android 卷III>即将公布,作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分. ...
- ASP.NET2.0组件控件开发视频 初体验
原文:ASP.NET2.0组件控件开发视频 初体验 ASP.NET2.0组件控件开发视频 初体验 录了视频,质量不是很好,大家体验下.我会重新录制的 如果不清楚,可以看看http://v.youku. ...
- ASP.NET自定义控件组件开发 第一章 第三篇
原文:ASP.NET自定义控件组件开发 第一章 第三篇 第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待 ...
- ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...
随机推荐
- 项目实践中--Git服务器的搭建与使用指南(转)
一.前言 Git是一款免费.开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.在平时的项目开发中,我们会使用到Git来进行版本控制. Git的功能特性: 从一般开发者的角度来 ...
- 2014年百度之星程序设计大赛 - 资格赛 第三题 Xor Sum
小记:艹蛋呢, 取long long的低30,32,34位都WA, 取31位才AC. .. 思路:依据求数组中两个数异或最大值.參考 代码: #include <stdio.h> #inc ...
- C++:抽象基类和纯虚函数的理解
转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...
- ubuntu下ssh使用 与 SCP 使用
1 ssh远程登录服务器 ssh username@remote_ip #将username换成自己的用户名,将remote_ip换成远程服务器的ip地址 2 将文件/文件夹从远程服务器拷至本地(sc ...
- WampServer:轻松配置Wordpress安装环境
WordPress运行环境 PHP 5.2.4 或更新版本(不支持第三方推出的“PHP 6.0”) MySQL 5.0 或更新版本 Apache mod_rewrite 模块(可选,用于支持“固定链接 ...
- 屌丝程序猿赚钱之道之taobao 2
续上篇,之前写的案例,都是比較0基础的. 案例4: 代写情书.软文.论文等等. 这是我一个同学的真实故事. 我隔壁寝室的小王平时没事就爱谢谢博客.逛逛论坛.大二的时候接触了威客网,開始在网上 ...
- Emacs经常使用快捷键的注意事项
一直用VIM,尝试了好几次Emacs都被它"多得像天上的星星"一样的快捷键给吓倒了.这几天最终下定决心再次尝试. 将它的Tutor练习了一下,顺便对经常使用快捷键做了一下笔记,方便 ...
- linux sort,uniq,cut,wc命令详解 (转)
sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 ...
- Java 执行四则运算
四种基本的操作原理是将被转换成后缀缀表达式表达.然后计算. 转换思路和原则.可以参考将中缀表达式转化为后缀表达式 import java.math.BigDecimal; import java.ut ...
- 三种方法让你的Service不被“一键加速”和系统杀掉
基本上大家都知道提高service优先级能够在非常大程度上让你的service免于由于内存不足而被kill,当然系统仅仅是在此时先把优先级低的kill掉,假设内存还是不够,也会把你的service干掉 ...