asp.net定义用户控件时,属性持久化和如何动态加载的问题
2008-08-24 15:48
806 查看
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
1 Business_UserControl_userCheckInfo UserCheckInfo1 = (Business_UserControl_userCheckInfo)LoadControl(@"UserControl\\userCheckInfo.ascx");
2 UserCheckInfo1.uidAndType = "数字";
3 Panel1.Controls.Add(UserCheckInfo3);
第一行是动态生成一个控件,第二行是为控件的属性赋值,第三行是把控件放到一个容器中,显示控件。
结论:动态加载控件太麻烦了,涉及很多内部原理,不如直接把用户控件扔到GridView的模板里,然后给属性赋值来初始化。这样就让.Net来保存用户控件的信息,不用我们自己操心了。
问题描述:在为用户控件属性赋值后,重新刷一次页面或回传一次服务器,用户控件的属性就会消失,但是.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
1 Business_UserControl_userCheckInfo UserCheckInfo1 = (Business_UserControl_userCheckInfo)LoadControl(@"UserControl\\userCheckInfo.ascx");
2 UserCheckInfo1.uidAndType = "数字";
3 Panel1.Controls.Add(UserCheckInfo3);
第一行是动态生成一个控件,第二行是为控件的属性赋值,第三行是把控件放到一个容器中,显示控件。
结论:动态加载控件太麻烦了,涉及很多内部原理,不如直接把用户控件扔到GridView的模板里,然后给属性赋值来初始化。这样就让.Net来保存用户控件的信息,不用我们自己操心了。
相关文章推荐
- asp.net 动态加载的用户控件属性传id值问题
- asp.net 动态加载的用户控件属性传id值问题
- Asp.net开发心得点滴[动态加载的用户控件使用事件委托,交给页面处理的事件无效问题]
- Asp.net 2.0 动态加载其他子目录用户控件问题
- Asp.net 2.0 动态加载其他子目录用户控件问题
- asp.net 动态创建TextBox控件 如何加载状态信息
- 在Asp.Net中动态加载用户控件
- ASP.NET动态加载用户控件的页面生成过程
- ASP.NET动态加载用户控件的方法
- ASP.net中的AJAX学习记录五:动态加载用户控件(Calendar控件为例)
- Asp.net动态加载用户自定义控件,并转换成HTML代码
- Asp.net 动态加载用户自定义控件,并转换成HTML代码
- 用户控件定义属性(C#:ASP.NET)
- ASP.NET中动态加载用户控件并传值
- ASP.net中动态加载控件时一些问题的总结
- ASP.NET动态加载用户控件的页面生成过程
- ASP.net中动态加载控件时一些问题的总结
- Asp.net动态加载用户自定义控件,并转换成HTML代码
- ASP.NET动态加载用户控件,关于后…
- ASP.net中的AJAX:动态加载用户控件(Calendar控件为例)