您的位置:首页 > 理论基础 > 数据结构算法

简单服务器控件 单值绑定 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);


        }

忽略了一句话带来了巨大的郁闷...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息