Подтвердить что ты не робот

Как проверить пользователя, выбрал по крайней мере один флажок в CheckBoxList?

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

В духе управления проверкой asp.net, что я могу использовать для обеспечения этого? Я также использую расширитель проверки Ajax, поэтому было бы неплохо, если бы оно выглядело как другие элементы управления, а не какой-нибудь cheesy server validate method в коде.

<asp:CheckBoxList RepeatDirection="Horizontal" RepeatLayout="Table" RepeatColumns="3" ID="ckBoxListReasons" runat="server">
    <asp:ListItem Text="Preliminary Construction" Value="prelim_construction" />
    <asp:ListItem Text="Final Construction" Value="final_construction" />
    <asp:ListItem Text="Construction Alteration" Value="construction_alteration" />
    <asp:ListItem Text="Remodel" Value="remodel" />
    <asp:ListItem Text="Color" Value="color" />
    <asp:ListItem Text="Brick" Value="brick" />
    <asp:ListItem Text="Exterior Lighting" Value="exterior_lighting" />
    <asp:ListItem Text="Deck/Patio/Flatwork" Value="deck_patio_flatwork" />
    <asp:ListItem Text="Fence/Screening" Value="fence_screening" />
    <asp:ListItem Text="Landscape - Front" Value="landscape_front" />
    <asp:ListItem Text="Landscape - Side/Rear" Value="landscape_side_rear" />
    <asp:ListItem Text="Other" Value="other" />
</asp:CheckBoxList>
4b9b3361

Ответ 1

Легко ли это сделать на стороне сервера проверки, но я предполагаю, что вы хотите сделать это на стороне клиента?

JQuery может сделать это очень легко, если у вас есть что-то, что все элементы управления флажком имеют общее назначение в качестве селектора, например class (CssClass на вашем элементе управления .NET). Вы можете создать простую функцию JQuery и подключить ее к пользовательскому валидатору ASP.NET. Помните, что если вы выполняете маршрут пользовательского валидатора, убедитесь, что вы также проверяете его на стороне сервера, если javascript не работает, вы не получаете бесплатную проверку на стороне сервера, как и другие. Validation.

Для получения дополнительной информации о настраиваемых валидаторах проверьте следующие ссылки: www.asp.net и MSDN

Вам не нужно использовать JQuery, он просто заставляет функцию javascript выполнять итерацию и гораздо проще смотреть на все ваши элементы управления флажками но вы можете просто использовать ванильный javascript, если хотите.

Вот пример, который я нашел по адресу: Ссылка на оригинал

<asp:CheckBoxList ID="chkModuleList"runat="server" >
</asp:CheckBoxList>

<asp:CustomValidator runat="server" ID="cvmodulelist"
  ClientValidationFunction="ValidateModuleList"
  ErrorMessage="Please Select Atleast one Module" ></asp:CustomValidator>

// javascript to add to your aspx page
function ValidateModuleList(source, args)
{
  var chkListModules= document.getElementById ('<%= chkModuleList.ClientID %>');
  var chkListinputs = chkListModules.getElementsByTagName("input");
  for (var i=0;i<chkListinputs .length;i++)
  {
    if (chkListinputs [i].checked)
    {
      args.IsValid = true;
      return;
    }
  }
  args.IsValid = false;
}

Боковое примечание: JQuery - это всего лишь небольшой файл js, который вам нужно добавить на свою страницу. Когда вы включите его, вы можете использовать все JQuery, которые вам нравятся. Нечего устанавливать, и он будет полностью поддержан в следующей версии Visual Studio. Я думаю.

Ответ 2

Здесь используется более мощная реализация jQuery, которая позволяет использовать ClientValidationFunction для любого количества элементов CheckBoxList на странице:

function ValidateCheckBoxList(sender, args) {
    args.IsValid = false;

    $("#" + sender.id).parent().find("table[id$="+sender.ControlId+"]").find(":checkbox").each(function () {
        if ($(this).attr("checked")) {
        args.IsValid = true;
        return;
        }
    });
}

Здесь разметка:

<asp:CheckBoxList runat="server"
          Id="cblOptions" 
          DataTextField="Text" 
          DataValueField="Id" />

<xx:CustomValidator Display="Dynamic" 
              runat="server" 
              ID="cblOptionsValidator"
              ControlId="cblOptions"
              ClientValidationFunction="ValidateCheckBoxList" 
              ErrorMessage="One selection required." />

И, наконец, пользовательский валидатор, который позволяет клиентской функции извлекать целевой элемент управления по ID:

public class CustomValidator : System.Web.UI.WebControls.CustomValidator
{
    public string ControlId { get; set; }

    protected override void OnLoad(EventArgs e)
    {
        if (Enabled)
            Page.ClientScript.RegisterExpandoAttribute(ClientID, "ControlId", ControlId);

        base.OnLoad(e);
    }
}

Ответ 3

Посмотрите эту статью от 4-х парней от Rolla:

http://aspnet.4guysfromrolla.com/articles/092006-1.aspx

Они показывают вам, как создать валидатор для элементов управления CheckBox и CheckBoxList, который работает точно так же, как RequiredFieldValidator для других элементов управления .NET. Он имеет проверку на стороне сервера и проверку на стороне клиента. Приятная часть этого - вы можете указать ValidationGroup, и она будет работать с элементом ValidationSummary.

В нижней части статьи есть ссылка для загрузки источника и использования его в вашем проекте. Вы просто ссылаетесь на dll и регистрируете элементы управления, и вам хорошо идти.

Ответ 4

Вот еще одно решение, которое можно рассмотреть с помощью Dado.Validators в GitHub.

<asp:CheckBoxList ID="cblCheckBoxList" runat="server">
    <asp:ListItem Text="Check Box (empty)" Value="" />
    <asp:ListItem Text="Check Box 1" Value="1" />
    <asp:ListItem Text="Check Box 2" Value="2" />
    <asp:ListItem Text="Check Box 3" Value="3" />
</asp:CheckBoxList>

<Dado:RequiredFieldValidator runat="server" ControlToValidate="cblCheckBoxList" ValidationGroup="vlgSubmit" />

Пример codebehind.aspx.cs

btnSubmit.Click += (a, b) =>
{
    Page.Validate("vlgSubmit");
    if (Page.IsValid) {
        // Validation Successful
    }
};

https://www.nuget.org/packages/Dado.Validators/

Ссылка: Проверьте, установлен ли флажок в группе флажков на стороне клиента

Ответ 5

Прокрутите каждый элемент в ckBoxListReasons. Каждый элемент будет иметь тип "ListItem".

ListItem будет иметь свойство "Selected", которое является логическим. Это правда, когда этот элемент выбран. Что-то вроде:

Dim bolSelectionMade As Boolean = False
For Each item As ListItem in ckBoxListReasons.Items
 If item.Selected = True Then
  bolSelectionMade = True
 End If
Next

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

Надеюсь, это поможет!

Ричард.

Ответ 6

Вы можете использовать CustomValidator для этого с небольшим количеством javascript.

<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Select at least one"
    ClientValidationFunction="checkCheckBoxList"></asp:CustomValidator>

<script type="text/javascript">
    function checkCheckBoxList(oSrc, args) {
        var isValid = false;
        $("#<%= CheckBoxList1.ClientID %> input[type='checkbox']:checked").each(function (i, obj) {
            isValid = true;
        });
        args.IsValid = isValid;
    }
</script>

И для a RadioButtonList

<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Select at least one" ClientValidationFunction="checkRadioButtonList"></asp:CustomValidator>

<script type="text/javascript">
    function checkRadioButtonList(oSrc, args) {
        if ($("input[name='<%= RadioButtonList1.UniqueID %>']:checked").val() == null) {
            args.IsValid = false;
        } else {
            args.IsValid = true;
        }
    }
</script>