Asp.net 3.5控件和组件开发技术系列—从零开始开发服务器控件(下)
此方法中。因为此方法不属于在专门的控件周期中才执行的方法,它可以在任意阶段 被开发人员任意调用,也就是说在此方法中如果滥用一些"无效信息"(比如上下文,或访问当前控 件周期阶段没有生成的资源),则会取不到正确的值。
举个例子,在前面创建的Field组合控件中,控件的属性就属于"无效信息"。在原来的代码中有 如下一段代码:
上面代码的功能是当使用控件的开发人员设置了验证表达式时,才呈现包含验证控件的表格和 验证控件对象;否则,不输出它们。这里要说明的是在Render方法中this.ValidateExpression能 够取得开发人员输入的值。 但是如果把条件语句代码段逻辑放到CreateChildControls中,似乎会更合理,因为如果没有设 置this.ValidateExpression属性,就不用创建验证控件,更能节省资源,更提高控件性能。 事实上,在Field控件的CreateChildControls方法中根本取不到任何属性的值,每次取到的值 都为null,因为当 CreateChildControls方法第一次执行时,在设计模式下相关程序还没有把属性 窗口的值赋值给控件的属性(事实上在Field控件中的逻辑是这样的:设计时系统程序正在做这件 事情,还没有做完),还取不到属性的值,虽然CreateChildControls会被调用多次,但所有逻辑 是当 this.ChildControlsCreated的值为false时才会真正执行CreateChildControls方法体逻辑, 第一次 CreateChildControls方法执行完成后,this.ChildControlsCreated就为true了,即使在 以后阶段,在 CreateChildControls方法中能够取到属性值,也没有机会再执行了。 所以,由于CreateChildControls的调用在控件生命周期的不确定性,强烈建议在开发中不要把 一些与创建子控件无关的逻辑放到该方法中,而是放到控件周期相关的方法中,比如上面的Render 方法,除了释放资源的方法,它基本上算是控件生命周期中最后一个周期阶段了,Render方法总是 在此阶段执行,一定能够确保访问到资源(比如Field 控件的所有属性)。 3.8.9 不要误解设计元属性DefaultValue 个人认为这里的命名DefaultValue很不好,容易让人理解成给控件属性赋予默认值,其实它的 真正意义不是这样的。 DefaultValue的功能主要体现在如下两点: 1.是否在属性窗口中标签为粗体 比如为一个属性设置了DefaultValue("请输入值:"),则在属性窗口中我们默认看到属性的值 仍然为null。这时当我们设置属性的值为"请输入值:",则当前属性标记会以粗体字体显示;否则 ,显示正常字体。 2.运行时是否读取属性 还是如1中设置DefaultValue("请输入值:")。如果这时设置属性的值为"请输入值:",则在控 件执行时系统不会读取属性的值(属性的get语句不会执行),而是返回null作为属性的值;反之 ,如果我们设置属性的值与DefaultValue属性值不同(不为"请输入值:"),则控件在生成时会读 取我们实际设置的值。 综上所述,如果我们设置了元设计属性DefaultValue("请输入值:"),则在构造方法中,也应 该为当前属性设置默认值为this.PropertyName ="请输 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |