Возникли проблемы с CustomValidator, который проверяет значения RadioButtonList и TextBox в asp.net

У меня есть форма, содержащая, среди прочего, TextBox с именем "wmi_cell_phone" и RadioButtonList "wmi_send_sms". По сути, мне нужно создать валидатор, который проверяет, является ли значение выбранного радио «Y». Если это так, то он проверяет, является ли значение TextBox пустым или нет. Если он пуст, то он должен уведомить пользователя о необходимости ввести значение.

Вот мой код .aspx:

<asp:TextBox ID="wmi_cell_phone" runat="server" MaxLength="100" Width="200px"></asp:TextBox>
<asp:RadioButtonList ID="wmi_send_sms" RepeatDirection="Horizontal" runat="server" Width="140px" CssClass="radio"></asp:RadioButtonList>

и код программной части (VB):

wmi_send_sms.Items(0).Value = "Y"
wmi_send_sms.Items(1).Value = "N"

Мой валидатор

<asp:CustomValidator ID="val_wmi_send_sms" runat="server"
ClientValidationFunction="ValidateSMS"
Display= "Dynamic"
ErrorMessage="Please enter a valid phone number."> </asp:CustomValidator>

<script language="javascript" type="text/javascript">                  
function ValidateSMS(Source, args) 
{

  var smsRadio = document.getElementsByName('<%= wmi_send_sms.ClientID %>');
      var cellphone = document.getElementById('<%= wmi_cell_phone.ClientID %>');    

   for (var x = 0; x < smsRadio.length; x ++) 
   {
      if (smsRadio[x].checked) 
      {
          if (smsRadio[x].value == "Y") 
          {
              if (cellphone.value == "")
                   args.IsValid = false;
              else
                   args.IsValid = true;
          }
      }
    }
}
</script>

Но, похоже, это не работает. Возможно, я неправильно обращаюсь к RadioButtonList.


person Joe    schedule 20.11.2010    source источник
comment
Что означает it doesn't seem to work? Вы отладили js-функцию? Опубликуйте также разметку вашего валидатора.   -  person Tim Schmelter    schedule 20.11.2010
comment
Я имею в виду, что он не делает то, что должен делать... если пользователь выбирает радио со значением "Да" и оставляет текстовое поле пустым, он должен предупредить пользователя о том, что он должен ввести значение в текстовое поле... но это ничего не делает   -  person Joe    schedule 20.11.2010
comment
Вы отладили, вызывается ли js-функция? Используйте инструменты разработчика, например: microsoft. com/downloads/en/ или FireBug для Firefox: дополнения. mozilla.org/en-US/firefox/addon/1843   -  person Tim Schmelter    schedule 20.11.2010


Ответы (2)



"Возможно, я неправильно обращаюсь к RadioButtonList..."

Ага.

Посмотрите на сгенерированную разметку, она будет примерно такой:

<table id="wmi_send_sms" class="radio" style="width:140px;">
  <tr>
    <td>
      <input id="wmi_send_sms_0" type="radio" name="wmi_send_sms" value="Y" />
      <label for="wmi_send_sms_0">Y</label>
    </td>
    <td>
      <input id="wmi_send_sms_1" type="radio" name="wmi_send_sms" value="N" />
      <label for="wmi_send_sms_1">N</label>
    </td>
  </tr>
</table>

Ваш тег <%= wmi_send_sms.ClientID %> получает идентификатор таблицы, содержащей список переключателей.

Лично мне при работе на стороне клиента гораздо проще избегать RadioButtonList. Просто создайте два элемента управления RadioButton, используя свойство GroupName, чтобы связать их друг с другом.

<asp:RadioButton ID="wmi_send_sms_y" runat="server" GroupName="wmi_send_sms" Text="Y" />
<asp:RadioButton ID="wmi_send_sms_n" runat="server" GroupName="wmi_send_sms" Text="N" />

Затем вы можете проверить, проверен ли «Y» в вашем валидаторе, открыв <%= wmi_send_sms_y.ClientID %>

person Carson63000    schedule 21.11.2010
comment
Спасибо Carson63000 за ваш вклад, я ценю это! К сожалению, я работаю над существующим проектом для клиента в компании, в которой я работаю. Я не могу изменить дизайн приложения (поэтому я не смогу перейти с RadioButtonList на RadioButton). Все, что мне разрешено, это добавить валидатор к существующему коду :( Вы знаете, как это бывает! - person Joe; 21.11.2010
comment
Справедливо. ОК, немного повозившись, я не смог найти супер простой способ получить идентификатор клиента отдельной кнопки внутри RadioButtonList. Но ‹%= wmi_send_sms.ClientID %› дает вам таблицу, в которую вы можете заглянуть — в конечном счете, вам нужно будет найти фактические элементы ‹input type=radio› и посмотреть, какие из них проверены. jQuery сделает это намного проще, если вы сможете его использовать. - person Carson63000; 22.11.2010
comment
В качестве альтернативы вы можете просто предположить, что идентификатор первого ‹input› будет идентификатором ClientID RadioButtonList с _0 в конце; то есть getElementsByName('‹%= wmi_send_sms.ClientID %›_0') Но я не уверен на 100%, что это будет безопасно или гарантированно никогда не изменится. - person Carson63000; 22.11.2010