新学服务器控件和数据绑定,将自己这几天的一些心得总结
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);
}
忽略了一句话带来了巨大的郁闷...