简单服务器控件 单值绑定 bind 的一些总结

新学服务器控件和数据绑定,将自己这几天的一些心得总结

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);
        }
忽略了一句话带来了巨大的郁闷...


posted @ 2007-11-01 19:19  Tachikoma  阅读(529)  评论(0编辑  收藏  举报