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

推荐订阅源

Know Your Adversary
Know Your Adversary
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
罗磊的独立博客
宝玉的分享
宝玉的分享
Vercel News
Vercel News
Martin Fowler
Martin Fowler
N
Netflix TechBlog - Medium
P
Proofpoint News Feed
T
Threatpost
Security Latest
Security Latest
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
I
Intezer
P
Privacy International News Feed
D
Docker
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
M
MIT News - Artificial intelligence
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
Lohrmann on Cybersecurity
Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
A
Arctic Wolf
IT之家
IT之家
S
SegmentFault 最新的问题
S
Securelist
博客园 - 叶小钗
N
News and Events Feed by Topic
F
Full Disclosure
Security Archives - TechRepublic
Security Archives - TechRepublic
Engineering at Meta
Engineering at Meta
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - Franky
GbyAI
GbyAI
AI
AI
Y
Y Combinator Blog
WordPress大学
WordPress大学
Latest news
Latest news
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
N
News | PayPal Newsroom
The Cloudflare Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
I
InfoQ

博客园 - 青青木

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来保存用户控件的信息,不用我们自己操心了。