简单服务器控件 单值绑定 bind 的一些总结
2007-10-27 15:17
309 查看
新学服务器控件和数据绑定,将自己这几天的一些心得总结
1.
首先是单值绑定的问题, 比如说对于TextBox的Text属性进行Bind,由于是Asp2.0的功能,文献很少,MSDN上也只是提到一句,也只能猜测其简单运行原理。
以 一个控件Custom嵌套在数据绑定GridView中,并将控件Text属性与数据源的一项绑定 为例
大致在ProcessPostData之后,LoadComplete之前,获取绑定属性并加以更新
2.
如果在LoadPostData中插入一个断点并在断点处强制退出,数据库相应绑定项会更新为空
个人认为,这暗示这一个数据处理上可能出现的错误,如果在更新前有个强制中断,可能导致数据库数据丢失
不知道这种猜测的正确性,并未验证
3.
关于接口IPostBackDataHandler的功能
第一次学,的确很迷茫,总结下来功能有下面两点:
1]读取页面提交的数据并以此更新子控件
2]以页面提交数据这一点为导火线(突然想到这个词,比较土),激发一些事件
这几天做的并未涉及到功能2],对于功能1]中的提交数据做了一些简单的研究:
重载IPostBackDataHandler接口,实现方法声明如下
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
设置断点,检测postCollection可以看到其数据结构中:
[2]__VIEWSTATE 视图状态
[3]...[n-3] 子控件状态
也就是说 视图状态其实和子控件状态在一起上传
个人理解为视图状态是一些加了密的<input type='hidden' value='*' />,这样对视图状态也就有了比较好的了解,其中,value='*'中的'*'可以使一些串行化的对象,而这一串行化的过程不需要人为干预,这也是视图状态最大的一个优点,同时也是不足[空间效率]
4.
有一点错误值得提出,也是这几天来碰到的最为恼火的事情,就是
服务器自定义复杂控件数据单值绑定后数据不更新的问题,简单的说就是提交后数据没有改变或变为null[这取决于你给数据的初值]
这点很让人郁闷,继承IPostBackDataHandler接口后在LoadPostData方法中设置断点,发现这个方法并没有被使用过
最终发现看过的技术文章里忽略了这样一句话[引用Microsoft ASP.net服务器控件与组件开发]
在加载回传数据阶段,即在加载阶段之前,页面查看在名/值表单传送集中的每一个名字,并且寻找控件树中与名字匹配的UniqueID控件...如果控件不能提供其UniqueID值作为表单元素的name attribute,那么可以通过调用控件PreRender方法中包含页面的RegisterRequiresPostBack方法来参与加载回传数据阶段
解释的很清楚,解决方案有两个
1]增加一个以UniqueID为name attribute的隐藏控件
protected override void Render(HtmlTextWriter writer)
...{
writer.Write("<input type='hidden' name='" + this.UniqueID + "'/>");
base.Render(writer);
}
2]调用RegisterRequiresPostBack
protected override void OnPreRender(EventArgs e)
...{
Page.RegisterRequiresPostBack(this);
base.OnPreRender(e);
}
忽略了一句话带来了巨大的郁闷...
1.
首先是单值绑定的问题, 比如说对于TextBox的Text属性进行Bind,由于是Asp2.0的功能,文献很少,MSDN上也只是提到一句,也只能猜测其简单运行原理。
以 一个控件Custom嵌套在数据绑定GridView中,并将控件Text属性与数据源的一项绑定 为例
大致在ProcessPostData之后,LoadComplete之前,获取绑定属性并加以更新
2.
如果在LoadPostData中插入一个断点并在断点处强制退出,数据库相应绑定项会更新为空
个人认为,这暗示这一个数据处理上可能出现的错误,如果在更新前有个强制中断,可能导致数据库数据丢失
不知道这种猜测的正确性,并未验证
3.
关于接口IPostBackDataHandler的功能
第一次学,的确很迷茫,总结下来功能有下面两点:
1]读取页面提交的数据并以此更新子控件
2]以页面提交数据这一点为导火线(突然想到这个词,比较土),激发一些事件
这几天做的并未涉及到功能2],对于功能1]中的提交数据做了一些简单的研究:
重载IPostBackDataHandler接口,实现方法声明如下
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
设置断点,检测postCollection可以看到其数据结构中:
[2]__VIEWSTATE 视图状态
[3]...[n-3] 子控件状态
也就是说 视图状态其实和子控件状态在一起上传
个人理解为视图状态是一些加了密的<input type='hidden' value='*' />,这样对视图状态也就有了比较好的了解,其中,value='*'中的'*'可以使一些串行化的对象,而这一串行化的过程不需要人为干预,这也是视图状态最大的一个优点,同时也是不足[空间效率]
4.
有一点错误值得提出,也是这几天来碰到的最为恼火的事情,就是
服务器自定义复杂控件数据单值绑定后数据不更新的问题,简单的说就是提交后数据没有改变或变为null[这取决于你给数据的初值]
这点很让人郁闷,继承IPostBackDataHandler接口后在LoadPostData方法中设置断点,发现这个方法并没有被使用过
最终发现看过的技术文章里忽略了这样一句话[引用Microsoft ASP.net服务器控件与组件开发]
在加载回传数据阶段,即在加载阶段之前,页面查看在名/值表单传送集中的每一个名字,并且寻找控件树中与名字匹配的UniqueID控件...如果控件不能提供其UniqueID值作为表单元素的name attribute,那么可以通过调用控件PreRender方法中包含页面的RegisterRequiresPostBack方法来参与加载回传数据阶段
解释的很清楚,解决方案有两个
1]增加一个以UniqueID为name attribute的隐藏控件
protected override void Render(HtmlTextWriter writer)
...{
writer.Write("<input type='hidden' name='" + this.UniqueID + "'/>");
base.Render(writer);
}
2]调用RegisterRequiresPostBack
protected override void OnPreRender(EventArgs e)
...{
Page.RegisterRequiresPostBack(this);
base.OnPreRender(e);
}
忽略了一句话带来了巨大的郁闷...
相关文章推荐
- 简单服务器控件 单值绑定 bind 的一些总结
- DNS查询与BIND名字服务器的一些简单配置文件说明
- 备忘:asp.net简单实现服务器控件的动态绑定
- 【Cocoa(mac) Application 开发系列之二】总结一些常用控件以及简单在自定义View上绘制字符串
- UIScrollView控件的一些简单介绍
- ASP.NET 非服务器控件绑定数据
- 对经常所使用算法的一些简单总结
- 本人服务器遭受黑客长期攻击,特把这几天做的一些有用的安全方面总结出来,以方便以后查阅
- ASP.net中动态加载控件时一些问题的总结
- asp.net Xml绑定到数据控件的两种简单方法
- 开发简单的自定义服务器控件
- Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。 (FromView)
- Repeater中的CheckBox绑定和存储数据之服务器控件
- 关于web服务器访问速度慢的一些简单解决方法
- 安卓初学:Radio单选框和checkBox多选控件的主要用法以及事件绑定总结
- VC++笔记 -- 简单的控件绑定和类型转换
- Android开发的一些简单的总结
- oracle的建表空间,imp导入导出,以及一些简单自我总结
- QT4 WebView控件使用简单总结
- ASP.NET数据绑定控件数据项中的服务器控件注册JS方法