Как проверить, что хотя бы в одном RadioButtonList выбран элемент? - PullRequest
2 голосов
/ 28 февраля 2011

У меня 20 RadioButtonList s на странице.

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

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

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

РЕДАКТИРОВАТЬ: Обновлен вопрос на основе комментариев и разъяснений.

Если вы проверяете по нескольким RadioButtonList с, то вам нужно использовать 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 элементы управления ( Источник ):

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 check:

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 голосов
/ 05 апреля 2012

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

        public static bool IsAnyItemSelected(this ListControl input) { return input.Items.Cast<ListItem>().Aggregate(false, (current, listItem) => current | listItem.Selected); }
0 голосов
/ 28 февраля 2011

Вы можете установить значение по умолчанию для вашего 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 Как указано в комментарии ниже, это само по себе не будет достаточным средством проверки. Хорошей практикой является также проверка всех пользовательских данных на стороне сервера.

...