Повторное использование выражения в контроле проверки регулярных выражений asp.NET
У меня есть это в файле 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 ответов
Создайте класс с константной строкой для каждого регулярного выражения, я использую это решение для вашей конкретной задачи. Этот класс находится в общей сборке, которая используется несколькими проектами. И вы, вероятно, используете регулярные выражения в некоторых других местах, а не только в средствах проверки.
Что-то вроде этого:
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.
Вы можете повторно использовать выражение regex (извлеките его в константу и установите в функции Page_Load для всех необходимых валидаторов regex)
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.
Вы можете написать свою собственную функцию проверки на стороне клиента, которая проверяет текстовые поля сразу после отправки, чтобы решить эту проблему, и вам также необходимо написать функцию проверки для стороны сервера.
Рассматривали ли вы добавление выражения в качестве параметра уровня проекта, а затем задаете "ValidationExpression" в выделенном фрагменте кода?
Конечно, вы можете сделать что-то вроде следующего:
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"));
Это добавит элемент управления validator на вашу страницу, и ваше выражение будет определено только здесь (оно может быть помещено в другой класс в качестве статического метода и распространено во всем проекте).
Вы также можете использовать метод в этом ответе переполнения стека, чтобы получить все валидаторы RegEx на своей странице, а затем установить ValidationExpression для каждой из них. Например, если вы поместите все свои элементы управления в Panel (с идентификатором RootPanel в моем примере) или аналогичным контейнерным элементом управления, то вы можете просто:
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.
Вам нужно будет использовать несколько валидаторов, но вы сможете сохранить выражение в виде значения в файле 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" />