Есть ли элегантный способ сравнить флажок и текстовое поле с помощью валидаторов ASP.NET?

StackOverflow https://stackoverflow.com/questions/88361

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть повторитель Asp.Net, который содержит текстовое поле и флажок.Мне нужно добавить проверку на стороне клиента, которая проверяет, что, когда флажок установлен, текстовое поле может принимать только нулевое или пустое значение.

Для этого я хотел бы использовать один или несколько элементов управления валидатором Asp.Net, чтобы обеспечить согласованное отображение ошибок на стороне клиента (ошибки на стороне сервера обрабатываются другой подсистемой).

Asp:CompareValidator кажется недостаточно гибким для выполнения такого рода сложного сравнения, поэтому мне остается рассмотреть Asp:CustomValidator.

Проблема, с которой я столкнулся, заключается в том, что, похоже, нет никакого способа передать пользовательскую информацию в функцию проверки.Это проблема, поскольку идентификаторы ClientId флажка и текстового поля мне неизвестны во время выполнения (поскольку они являются частью повторителя).

Так...Мои варианты кажутся такими:

  1. Каким-то образом передайте текстовое поле и флажок в CustomValidator (кажется, это невозможно).
  2. Найдите TextBox с помощью JavaScript на основе аргументов, переданных CustomValidator.Возможно ли это вообще, если ClientId неоднозначен?
  3. Полностью забудьте о проверке и создайте собственный 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");
}

...или что-то вроде того.Я написал код в уме.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top