あなたは確かに次のようなことをすることができます:
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"));
これにより、バリデーターコントロールがページに追加され、式はここでのみ定義されます(静的メソッドとして別のクラスに配置し、プロジェクト全体で共有できます)。
このStackOverflow回答のメソッドを使用して、ページ上のすべての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の拡張メソッドについては、この記事を参照してください。
何が起こっても、コントロールごとに1つのRegularExpressionValidatorが必要です。もちろん、他のオプションは、javascriptまたはPostBackでこれらを手動で検証することです。