2011-02-28 2 views
2

У меня есть 20 RadioButtonList s на странице.Как проверить, что хотя бы один элемент RadioButtonList имеет выбранный элемент?

Мне нужно создать метод проверки, чтобы гарантировать, что хотя бы один из этих RadioButtonList s имеет выбранный элемент.

Какую проверку я должен использовать для этого?

ответ

2

EDIT: Обновленный вопрос, основанный на комментариях и разъяснениях.

Если вы проверяете множественные RadioButtonList s, вам необходимо использовать CustomValidator и реализовать проверку на стороне сервера.

Вот некоторый тест разметка:

<asp:RadioButtonList ID="rblstTest1" runat="server" ValidationGroup="Test"> 
    <asp:ListItem Text="Test 1" Value="1" /> 
    <asp:ListItem Text="Test 2" Value="2" /> 
    <asp:ListItem Text="Test 3" Value="3" /> 
</asp:RadioButtonList> 
<br /><br /> 
<asp:RadioButtonList ID="rblstTest2" runat="server" ValidationGroup="Test"> 
    <asp:ListItem Text="Test 1" Value="1" /> 
    <asp:ListItem Text="Test 2" Value="2" /> 
    <asp:ListItem Text="Test 3" Value="3" /> 
</asp:RadioButtonList><br /> 
<asp:Button ID="btnTestRb" runat="server" ValidationGroup="Test" Text="Test RBL" 
    OnClick="btnTestRb_Click" /> 
<asp:CustomValidator runat="server" ValidationGroup="Test" ID="cvTest" 
    ControlToValidate="rblstTest1" OnServerValidate="cvTest_ServerValidate" 
    ValidateEmptyText="true" Enabled="true" display="Dynamic" SetFocusOnError="true" 
    ErrorMessage="You must select at least one item." /> 

Используйте следующий метод расширения, чтобы найти все RadioButtonList управления (Source):

static class ControlExtension 
{ 
    public static IEnumerable<Control> GetAllControls(this Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control descendant in control.GetAllControls()) 
      { 
       yield return descendant; 
      } 
     } 
    } 
} 

Затем реализовать на сторону сервера CustomValidator проверки:

protected void cvTest_ServerValidate(object sender, ServerValidateEventArgs e) 
{    
    int count = this.GetAllControls().OfType<RadioButtonList>(). 
     Where(lst => lst.SelectedItem != null).Count(); 
    e.IsValid = (count > 0); 
} 

Я тестировал приведенный выше пример и, похоже, делает именно то, что вам нужно. Вы можете легко переключить его на VB. Надеюсь, это решает вашу проблему.

+0

Просто, чтобы уточнить, у меня есть 20 разных списков RadioButtonLists. Нет обязательных полей, но мне нужно, чтобы хотя бы один из них был заполнен до того, как форма будет отправлена. – Tom

0

Вы можете установить значение по умолчанию для вашего RadioButtonList, что означало бы пользователь не мог не выбрать вариант, и вам не нужно будет весь код проверки

<asp:RadioButtonList ID="RadioButtonList1" runat="server"> 
    <asp:ListItem Selected="True">Never</asp:ListItem> 
    <asp:ListItem>Twice A Week</asp:ListItem> 
    <asp:ListItem>Every Day Baby!</asp:ListItem> 
</asp:RadioButtonList> 

EDIT Как было отмечено в комментарий ниже этого сам по себе не будет достаточным средством проверки. Хорошей практикой является также проверка всех пользовательских вводных данных на стороне сервера.

+0

Это будет по-прежнему позволяет запрос HTTP, чтобы быть сделано без выбора кнопки радио, хотя. Требуется сопутствующий код на стороне сервера, чтобы обеспечить его соблюдение. –

+0

Абсолютно - хорошая точка. Я уточню свой ответ. –

0

Я использую метод расширения, который работает для ListControls

 public static bool IsAnyItemSelected(this ListControl input) { return input.Items.Cast<ListItem>().Aggregate(false, (current, listItem) => current | listItem.Selected); }