惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V
Visual Studio Blog
博客园_首页
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
MongoDB | Blog
MongoDB | Blog
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
D
Docker
博客园 - 司徒正美
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
U
Unit 42
J
Java Code Geeks
A
About on SuperTechFans
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Security Affairs
I
Intezer
Cisco Talos Blog
Cisco Talos Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog RSS Feed
P
Privacy & Cybersecurity Law Blog
T
Tenable Blog
T
Threatpost
H
Hacker News: Front Page
G
Google Developers Blog
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research
L
Lohrmann on Cybersecurity
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
S
Secure Thoughts
GbyAI
GbyAI
NISL@THU
NISL@THU
S
Security @ Cisco Blogs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog

博客园 - 青青木

ASP.net2.0把word、excel转换成Html(转) 在三层交换机上开专线IP的方法 [转]静态框架导航,左侧折叠树的样式,类似于treeview 在ASP.NET中使用FCKEditor的简单配置方法 Matlab与Access数据库的连接 [转]用matlab做聚类分析 Word 2003特殊符号录入与编辑(转) C++内存分配的五种的区别(转) C#中正则表达式的完全匹配 插入SQL语句后,返回刚插入记录的ID 命名空间“Microsoft office”中不存在类型或命名空间名称“Interop” GridView相应模板列中的LinkButton按钮的事件 visual studio 2005 和 sql server 2005 安装时需要注意的事项 使用ConfigurationManager需要在.net引用中添加System.Configuration引用 还原数据库后,用户名出错,不能修改用户属性 DataView设置datasource后,需要databind() asp.net中重命名网页的一种方法 C++语言中的虚函数 vc中出现“没有找到mspdb60.dll文件”时 ,解决方法
asp.net定义用户控件时,属性持久化和如何动态加载的问题
青青木 · 2008-08-24 · via 博客园 - 青青木

1 用户控件的属性持久化问题:(参考:道不远人---深入解析ASP.NET2.0控件开发)

      问题描述:在为用户控件属性赋值后,重新刷一次页面或回传一次服务器,用户控件的属性就会消失,但是.NET自带的控件不会出现这种问题。

      原因:要解释上面的问题,我们需要回顾一下 HTTP协议的工作模式,HTTP是一种无状态的断开式连接模式,也就是说,客户端向服务器发出请求,服务器端做出响应后就不在维持此次请求客户端的信息。在默认情况下,多次请求来自于同一个客户端还是多个不同的客户端,对于服务端来说处理方式没什么不同。

     所以我们单击页面上的按钮,把页面回传到服务器后,服务器并不能把页面中的控件的所有状态还原到上一次请求时设置的值,因为它根本不知道上一次请求是哪一次,也没有为每一次请求保存历史信息。

     解决方法:

     HTTP的这种无状态特征为我们的开发带来了和Winforms开发模型极不一致,用户和控件交互的结果不能保存下来等问题。

     而在实际开发过程中,我们又发现ASP 。NET提供的控件却可以很好的在页面回传过程中保存自己的状态。比如,我们在页面中添加一个Label控件,并在按钮事件中添加:   

     this.lblHappy.text += this.lblHappy.text + "again"

     Label显示的文本可以正确地基于前次请求设置的值再加上“again”,这是怎么回事呢?

     原来ASP.NET为了解决保存控件状态的矛盾,引入了一种叫视图(ViewState)的特性。需要在页面回传过程中保存值的控件属性,可以把值保存在视图状态中。(1)ASP.NET框架会在呈现页面前(服务器把页面发送到客户端),把视图状态信息序列化成一个字符串,并保存到页面中一个叫"_VIEWSTATE"的隐藏表单域(<input type = 'hidden'>)中.这样,控件的状态就保存到了客户端。(2)表单域下次回传时(客户端把页面提交到服务器),服务器端再对提交回的_VIEWSTATE隐藏域的值进行反序列化,还原各个控件的状态。

     或者这样解释ViewState的原理:当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的。

     举例说明:   

Code

2 动态引用用户控件:

     直接在页面上用拖拽的方式引用空间是非常简单的,如果想在代码中动态生成可以用如下方法:

    (控件的类) 名称=(控件的类)this.LoadControl("......ascx")

    只需要控件的类名和路径就可以定义一个控件。

   示例如下:

Code

第一行是动态生成一个控件,第二行是为控件的属性赋值,第三行是把控件放到一个容器中,显示控件。

结论:动态加载控件太麻烦了,涉及很多内部原理,不如直接把用户控件扔到GridView的模板里,然后给属性赋值来初始化这样就让.Net来保存用户控件的信息,不用我们自己操心了。