asp.net - seleccionado - validacion de checkbox en c#



¿Cómo validar a un usuario para elegir al menos una casilla de verificación en CheckBoxList? (4)

Tengo un control CheckBoxList que quiero solicitar al usuario que marque al menos UNA casilla, no importa si comprueba cada uno, o 3, o incluso solo uno.

En el espíritu de los controles de validación de asp.net, ¿qué puedo usar para hacer cumplir esto? También estoy usando el extensor de validación Ajax, por lo que sería bueno si pudiera parecerse a otros controles, y no a algún método de validación de servidor cursi en el código subyacente.

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

Answer #1

Aquí hay otra solución que se puede considerar a través de Dado.Validators en 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" />

Ejemplo codebehind.aspx.cs

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

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

Ref .: Marque si una casilla de verificación está marcada en un grupo de casillas de verificación en el lado del cliente


Answer #2

Aquí hay una implementación jQuery más limpia que permite una ClientValidationFunction para cualquier número de controles CheckBoxList en una página:

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;
        }
    });
}

Aquí está el marcado:

<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." />

Y finalmente, el validador personalizado que permite que la función del cliente recupere el control objetivo por 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);
    }
}

Answer #3

Mira este artículo de 4 chicos de Rolla:

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

Le muestran cómo crear un validador para los controles CheckBox y CheckBoxList que funciona exactamente como RequiredFieldValidator para los otros controles .NET. Tiene la validación del lado del servidor y la validación del lado del cliente. Lo bueno de eso es que puedes especificar un ValidationGroup y funcionará con el control ValidationSummary.

También hay un enlace en la parte inferior del artículo para descargar la fuente y usarla en su proyecto. Simplemente hace referencia al dll y registra los controles, y ya está listo para comenzar.


Answer #4

Pasa por cada uno de los elementos en ckBoxListReasons. Cada elemento será del tipo 'ListItem'.

El ListItem tendrá una propiedad llamada 'Seleccionado' que es un booleano. Es cierto cuando se selecciona ese elemento. Algo como:

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

bolSelectionMade se establecerá en verdadero si el usuario ha realizado al menos una selección. Puede usar eso para establecer el estado Válido de cualquier control de validador particular que desee.

¡Espero que esto ayude!

Ricardo.





checkboxlist