ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性                                        深入讲解控件的属性持久化(一)系列文章链接:ASP.
原文: ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

                                        深入讲解控件的属性持久化(一)

系列文章链接:

ASP.NET自定义控件组件开发 第一章 待续

ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

ASP.NET自定义控件组件开发 第一章 第三篇

ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

ASP.NET自定义控件组件开发 第五章 模板控件开发

ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

ASP.NET2.0组件控件开发视频 初体验

 

     自从写了控件开发的文章后,收到了不少朋友的来信,提出了不少的问题,感谢大家的关注。今天就把大家说的一些问

题来讲解下。

     虽然我这个系列是控件开发,但是我的目的还是希望大家通过开发控件更加快速的对ASP.NET有更加深入的了解,所以

我们也很有必要把一些基础性的东西将清楚。

     为了达到深入讲解属性的目的,我首先来讲讲页面周期和页面解析的一些问题:

     1。页面的解析:

     大家可能听说,页面在提交给服务器的时候,都是被解析成为了一个个的继承与Page的类,最直接的证明就是:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

     大家看看,就是那个代码隐藏

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
CodeFile="Default.aspx.cs" Inherits="_Default"

 

     大家也许觉得疑惑:一个aspx的页面都是一些标记语言啊,如下面:(注意:是将下面的文本解析为一个类)

 

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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类。如下:(伪码,只是演示而已,真正的不是这样的):

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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事件中写下如下

代码:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifCode
    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.

目录
相关文章
|
5月前
|
开发框架 JavaScript 前端开发
震撼!破解 ASP.NET 服务器控件 Button 执行顺序之谜,颠覆你的开发认知!
【8月更文挑战第16天】在ASP.NET开发中,通过Button控件实现先执行JavaScript再触后台处理的需求十分常见。例如,在用户点击按钮前需前端验证或提示,确保操作无误后再传递数据至后台深度处理。此过程可通过设置Button的`OnClientClick`属性调用自定义JavaScript函数完成验证;若验证通过,则继续触发后台事件。此外,结合jQuery也能达到相同效果,利用`__doPostBack`手动触发服务器端事件。这种方式增强了应用的交互性和用户体验。
60 8
|
4月前
|
开发框架 JavaScript 前端开发
|
6月前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
7月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
91 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
7月前
|
SQL 开发框架 .NET
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
|
8月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
93 0
|
.NET
ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇                                                    第三章 为控件添加事件 后篇              前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通。
1094 0
|
.NET
ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇       第三章 为控件添加事件                        好了,我们之前以前开发一个控件。而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件。
939 0
|
4月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
56 7
|
4月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
102 0