动态控件,复合控件,相信大家都已经很熟悉了。只要达到同样的展示及功能,用什么样的方式实现应该取决于实际情况。我在一个项目中遇到的情况是:已经有了很多页面,但每个页面都没有用Validation控件来验证输入的有效性。
为了达到相同的展示效果:
常规办法:是为每个页面的每个TextBox有选择的生成RequiredFieldValidator、RangeValidator、CompareValidator、RegularExpressionValidator、FilteredTextBoxExtender。但这个方法,需要每个页面都去添加,并且统一调整起效果来,工作量太大。
复合控件:是写一个复合控件,依参数来添加验证控件。这个也需要在页面中统一添加一次(工作量约为第一个办法的1/3),还需要更改一下后台的控件类型声明(我的后台代码在另一个程序集中)。
动态控件:写了个直接继承自TextBox的控件,在适当的地方,依参数来添加验证控件。这个也需要在页面中统一改动一下(工作量和复合控件的方法相当),不过,后台的代码不用做发改动。
前两种,大家不陌生,我就不啰嗦了。这里,只说一下用动态控件实现上面功能的方法。
先展望一下使用方法:
<!-- 必须输入 -->
<facade:StringTextBox Options="required" HelpMessage="请输入用户名" DisplayName="用户名"
runat="server" ID="StringTextBox1" MaxLength = "30" /><br />
<!-- 必须输入,只能输入数字 -->
<facade:StringTextBox Options="required,Filtered" HelpMessage="请输入用户名"
FilterType="Numbers" DisplayName="用户名" runat="server" ID="StringTextBox2" MaxLength = "30" /><br />
<!-- 必须输入,只能输入数字,数值范围是0-400 -->
<facade:NumberTextBox runat="server" ID = "tbCount" MinValue="0" MaxValue="400" DisplayName="数量"
HelpMessage="请输入数量" />
<!-- 必须输入,只能输入数字,数值范围是0-400 -->
<facade:MoneyTextBox runat="server" ID = "NumberTextBox1" MinValue="0" MaxValue="400"
DisplayName="金额" HelpMessage="请输入金额" />
<!-- 必须输入,输入的字符串必须以ABC开头 -->
<facade:RegexTextBox runat="server" Options="Required" ValidationExpression="^abc.+contentquot;
ID="tbRegex" DisplayName="正则测试" MaxLength="120" Example="abc123,abceee" HelpMessage="请输入正则测试" />
<!-- 输入的必须是手机号 -->
<facade:PhoneTextBox runat="server" ID="tbMobile" PhoneTypes="Mobile" DisplayName="手机号"
MaxLength="20" Example="13988888888" HelpMessage="请输入手机号" />
<!-- 输入的必须是手机号,或者电话 -->
<facade:PhoneTextBox runat="server" ID="tbPhoneMobile" PhoneTypes="Phone,Mobile" DisplayName="手机号"
MaxLength="20" Example="13988888888,0311-88886666" HelpMessage="请输入手机号" />
动态控件的添加,应该在Page.PreInit中添加,因为此时控件还没有加载ViewState。但控件中得不到Page.PreInit事件,我们遇到了第一个难题;
如果 |