ASP.NET: агрегирование валидаторов в пользовательском элементе управления - PullRequest
0 голосов
/ 16 марта 2010

Я занимаюсь разработкой веб-приложения, в котором я хотел бы выполнить набор проверок для определенного поля (имя учетной записи в конкретном случае).
Мне нужно проверить, что значение не пустое, соответствует определенному шаблону и еще не используется.
Я попытался создать UserControl, который объединяет RequiredFieldValidator, RegexValidator и CustomValidator, затем я создал свойство ControlToValidate, например:

public partial class AccountNameValidator : System.Web.UI.UserControl {
    public string ControlToValidate {
        get { return ViewState["ControlToValidate"] as string; }
        set { 
            ViewState["ControlToValidate"] = value;
            AccountNameRequiredFieldValidator.ControlToValidate = value;
            AccountNameRegexValidator.ControlToValidate = value;
            AccountNameUniqueValidator.ControlToValidate = value;
        }
    }
}

Однако, если я вставляю элемент управления на страницу и устанавливаю ControlToValidate для некоторого идентификатора элемента управления, при загрузке страницы появляется сообщение об ошибке Невозможно найти идентификатор элемента управления "AccountName", на который ссылается ControlToValidate свойство AccountNameRequiredFieldValidator , которое заставляет меня думать, что элементы управления внутри моего UserControl не могут правильно разрешать элементы управления на родительской странице.

Итак, у меня два вопроса:

1) Можно ли иметь элементы управления validator внутри UserControl для проверки элемента управления на родительской странице?

2) Является ли правильной и эффективной практикой "объединять" несколько элементов управления валидатора в UserControl? Если нет, то каков стандартный путь?

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Я полагаю, что ASP.NET ожидает, что идентификатор ControlToValidate находится в том же контейнере именования. Вероятно, вы можете переопределить метод проверки и использовать Parent.FindControl.

РЕДАКТИРОВАТЬ: Это может быть хорошим местом для использования CompositeControl, а не UserControl. Они предназначены именно для такого рода агрегации. Но у вас может быть похожая проблема NamingContainer.

1 голос
/ 16 марта 2010

Сначала отвечу на ваш второй вопрос - я не думаю, что это хорошая идея, чтобы «объединять» валидаторы таким образом, если вы не включите проверяемые элементы управления в пользовательский элемент управления. Слишком много работы для недостаточной отдачи.

Вы можете решить эту проблему, выставив свойства на вашем AggregatedValidator, чтобы задать имена проверяемых элементов управления, и передайте ClientID тех элементов управления, которые вы хотите проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...