我在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的新手。
答案 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" />