在asp.NET正则表达式验证控件中重用表达式

时间:2012-05-15 22:29:43

标签: asp.net ascx

我在ascx文件中有这个:

<asp:textbox ID="AddHourlyRate" runat="server" width="55px" />
<asp:RegularExpressionValidator  ID="AddHourlyRateRegexValidator"
    ErrorMessage="Please enter a valid charge rate (whole number only)" 
    ValidationExpression="^\$?[0-9]+(\.[0]{2})?$" ControlToValidate="AddHourlyRate" 
    Display="Dynamic" runat="server" />

如何在不复制粘贴正则表达式表达式的情况下重用其他ValidationExpression中的asp:RegularExpressionValidator?我是asp.NET的新手。

5 个答案:

答案 0 :(得分:5)

为每个正则表达式创建一个带有const字符串的类,我使用该解决方案来解决您的确切问题。该类位于一个由多个项目共享的公共程序集中。并且您可能在其他一些地方使用正则表达式而不仅仅是验证器控件。

这样的事情:

public class RegularExpressions
{
  public const string TelephoneValidation = @"^[0-9 ]+$";
  public const string IntegerValidation = @"^\d+$";
}

然后,您可以从后面的代码设置验证器表达式:

validator.ValidationExpression = RegularExpressions.IntegerValidation;

或标记:

<%@ Import Namespace="RegularExpression.Class.Namespace" %>  
.
.
.  
<asp:RegularExpressionValidator  ID="AddHourlyRateRegexValidator"
        ErrorMessage="Please enter a valid charge rate (whole number only)" 
        ValidationExpression="<%# RegularExpressions.IntegerValidation %>" ControlToValidate="AddHourlyRate" 
        Display="Dynamic" runat="server" />

当然在import directive中编写适当的命名空间。

答案 1 :(得分:2)

您可以重复使用正则表达式(将其提取到常量并在Page_Load函数中为所有必需的正则表达式验证器设置)

public const string WholeNumbersValidation = @"^\$?[0-9]+(\.[0]{2})?$";

protected void Page_Load(object sender, EventArgs e)
{
   AddHourlyRateRegexValidator.ValidationExpression = WholeNumbersValidation;
   AddHourlyRateRegexValidator.ErrorMessage= "Please enter a valid charge rate (whole number only)";
   validatorIdForNextField.ValidationExpression = WholeNumbersValidation;
   validatorIdForNextField.ErrorMessage= "Error message text 2";

}

,但您无法在一些字段中重复使用一个正则表达式ASP.NET验证程序,因为ControlToValidate属性中不接受多个ID。

您可以编写自己的客户端验证函数,在提交时一次性验证文本框以解决此问题,您还应该为服务器端编写验证函数。

答案 2 :(得分:1)

您是否考虑将表达式添加为项目级设置,然后在代码隐藏中设置“ValidationExpression”?

答案 3 :(得分:1)

您当然可以执行以下操作:

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 answer中的方法获取页面上的所有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中的this article for extension methods

无论发生什么,每个控件都需要一个RegularExpressionValidator。当然,您的另一个选择是在javascript或PostBack上手动验证这些。

答案 4 :(得分:1)

您必须使用多个验证器,但您应该能够将表达式存储为web.config文件中的值,然后通过内联C#访问它。

在web.config中:

<appSettings>
  <add key="myRegExString" value="^\$?[0-9]+(\.[0]{2})?$" />
</appSettings>

在YourPage.aspx中:

<asp:textbox ID="AddHourlyRate" runat="server" width="55px" />
<asp:RegularExpressionValidator  ID="AddHourlyRateRegexValidator"
    ErrorMessage="Please enter a valid charge rate (whole number only)" 
    ValidationExpression="<% = ConfigurationSettings.AppSettings["myRegExString"]%>" ControlToValidate="AddHourlyRate" 
    Display="Dynamic" runat="server" />