3

我在 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" />

如何在无需复制粘贴正则表达式的情况下重用ValidationExpressionin other ?asp:RegularExpressionValidator我是 asp.NET 的新手。

4

5 回答 5

6

为每个正则表达式创建一个带有 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" />

当然,在导入指令中编写适当的命名空间。

于 2012-05-15T22:44:35.313 回答
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 。

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

于 2012-05-15T22:37:47.833 回答
1

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

于 2012-05-15T22:37:53.150 回答
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 答案中的方法来获取页面上的所有 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 上手动验证这些。

于 2012-05-15T22:41:40.387 回答
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" />
于 2012-05-15T22:43:29.587 回答