Есть ли элегантный способ сравнить флажок и текстовое поле с помощью валидаторов ASP.NET?
-
01-07-2019 - |
Вопрос
У меня есть повторитель Asp.Net, который содержит текстовое поле и флажок.Мне нужно добавить проверку на стороне клиента, которая проверяет, что, когда флажок установлен, текстовое поле может принимать только нулевое или пустое значение.
Для этого я хотел бы использовать один или несколько элементов управления валидатором Asp.Net, чтобы обеспечить согласованное отображение ошибок на стороне клиента (ошибки на стороне сервера обрабатываются другой подсистемой).
Asp:CompareValidator кажется недостаточно гибким для выполнения такого рода сложного сравнения, поэтому мне остается рассмотреть Asp:CustomValidator.
Проблема, с которой я столкнулся, заключается в том, что, похоже, нет никакого способа передать пользовательскую информацию в функцию проверки.Это проблема, поскольку идентификаторы ClientId флажка и текстового поля мне неизвестны во время выполнения (поскольку они являются частью повторителя).
Так...Мои варианты кажутся такими:
- Каким-то образом передайте текстовое поле и флажок в CustomValidator (кажется, это невозможно).
- Найдите TextBox с помощью JavaScript на основе аргументов, переданных CustomValidator.Возможно ли это вообще, если ClientId неоднозначен?
- Полностью забудьте о проверке и создайте собственный JavaScript (что позволит мне передать оба ClientId в пользовательскую функцию).
Есть идеи, как лучше это реализовать?
Решение
Я думаю, что лучшим способом было бы наследовать BaseValidator в новом классе и передать эти идентификаторы вашему элементу управления в качестве атрибутов.Вы должны иметь возможность разрешать идентификаторы в своем валидаторе, не зная полного идентификатора на стороне клиента, который генерируется во время выполнения.Сначала вы должны получить данные, проверяемые на сервере, а затем на клиенте.
Другие советы
А нельзя ли поставить CustomValidator внутрь репитера?Если нет, вы можете создать его динамически, когда ретранслятор привязан и пользователь FindControl()
protected MyDataBound(object sender, RepeaterItemEventArgs e) {
(CheckBox)cb = (CheckBox)e.Item.FindControl("myCheckboxName");
(TextBox)tb = (TextBox)e.Item.FindControl("myTextBox");
}
...или что-то вроде того.Я написал код в уме.