您当然可以执行以下操作:
private RegularExpressionValidator GetValidatorControl(string controlToValidate, string errorMessage)
{
RegularExpressionValidator validator = new RegularExpressionValidator();
validator.ID = String.Format("{0}RegExValidator", controlToValidate);
validator.ValidationExpression = @"^\$?[0-9]+(\.[0]{2})?$";
validator.ControlToValidate = controlToValidate;
validator.ErrorMessage = errorMessage;
return validator;
}
而且,在 Page_Load 事件或类似事件中,您可以这样调用它:
Page.Controls.AddAt(Page.Controls.IndexOf(AddHourlyRate) + 1, GetValidatorControl(control.ID, "my validation message"));
这会将验证器控件添加到您的页面,并且您的表达式将仅在此处定义(它可以作为静态方法放置到另一个类中并在整个项目中共享)。
您还可以使用此Stack Overflow 答案中的方法来获取页面上的所有 RegEx 验证器,然后在每个验证器上设置 ValidationExpression。例如,如果您将所有控件包装在 Panel 中(在我的示例中使用 RootPanel 的 ID)或类似的容器控件,那么您可以:
IEnumerable<Control> validators = RootPanel.FlattenChildren();
IEnumerator<Control> enumerator = validators.GetEnumerator();
while (enumerator.MoveNext() == true)
{
if (enumerator.Current is RegularExpressionValidator) //Only interested in RegularExpressionValidators. You could even filter this further by naming them consistently and checking for a fragment of the ID here.
{
((RegularExpressionValidator)enumerator.Current).ValidationExpression = @"^\$?[0-9]+(\.[0]{2})?$"; //Load from config if necessary!
}
}
要使用 FlattenChildren 方法,请将其放入项目中某处的公共静态类中,并使用适当的 using 指令引用它。有关.Net 中的扩展方法,请参阅本文。
无论发生什么情况,每个控件都需要一个 RegularExpressionValidator。当然,您的另一个选择是在 javascript 或 PostBack 上手动验证这些。