在使用 DynamicField / DynamicControl 时经常在PostBack时会出现一个例外 The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source that supports Dynamic Data 中文为绑定到支持动态数据的数据源的数据控件内必须存在 DynamicControl/DynamicField 具体发生原因暂时不太清楚估计是PostBack的事件流程和页面正常加载不一致当PostBack后数据控件(如DetailsView GridView ListView 等)在状态加载时 会把所有的 Fileds或Columns初始化一次而这一次由于数据源没有绑定所以找不到相关的 MetaTable在这种情况下DynamicControl 和 DynamicField 都是丢出上述的例外 不过从应用上来看如果数据绑定做的合理的话(比如在InitComplete以前绑定)是不会出现这个问题的但是一旦出了这个问题解决起来就比较麻烦了因为常常有些人习惯于在Load中绑定数据要修改的话常常会牵连一大堆的代码希望对这个问题比较了解的朋友多多指教 目前我采用的方法可以不改变原有的绑定流程可以跟以前的EvalBind等一样使用可以让大家试试在使用中如有发现有Bug请发邮件告诉我因为我最近几个月都在应用 DynamicFieldTemplates 来开发应用程序对这些问题比较关心 使用这种方法可以让一些程序经验不足的人也能避开这个错误 我分别从DynamicControl 和 DynamicField 继承了新的类 DdControl 和 DdField然后在初始化时判断是否存在MetaTable如果不存在则不再初始化然后程序中原本所有采用 DynamicControl/DynamicField的地方都换成DdControl/DdField DdControl/DdField的源码如下 namespace Common { public class DdField : DynamicField { public override void InitializeCell(SystemWebUIWebControlsDataControlFieldCell cell SystemWebUIWebControlsDataControlCellType cellType SystemWebUIWebControlsDataControlRowState rowState int rowIndex) { // HACK: Fix bug for: The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source that supports Dynamic Data if (baseControlFindMetaTable() == null) return; baseInitializeCell(cell cellType rowState rowIndex); } } } namespace Common { public class DdControl : DynamicControl { protected override void OnInit(EventArgs e) { // HACK: Fix bug for: The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source that supports Dynamic Data if (thisFindMetaTable() != null) baseOnInit(e); } } } 使用时只要在nfig中配置好前缀 就可以直接使用了如 <! 假设上述的程序生成 Commondll > <add tagPrefix=asp namespace=Common assembly=Common/> <DetailsView > <Fields> <asp:DdField DataField=Name /> </Fields> </DetailsView> |