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

votos
33

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>
Publicado el 18/07/2009 a las 01:09
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
0

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.

Respondida el 18/07/2009 a las 02:17
fuente por usuario

votos
59

Es fácil hacer este lado del servidor de validación, pero supongo que quieres hacerlo del lado del cliente.

JQuery puede hacer esto muy fácilmente siempre que tenga algo que todos los controles de casilla de verificación tengan en común para usar como un selector como clase (CssClass en su control .NET). Puede hacer una función JQuery simple y conectarla a un validador personalizado de ASP.NET. Recuerde que si utiliza la ruta del validador personalizado para asegurarse de que también lo verifique en el servidor, en caso de que JavaScript no funcione, no obtendrá una verificación gratuita del servidor como los otros validadores .NET.

Para obtener más información sobre validadores personalizados, consulte los siguientes enlaces: www.asp.net y MSDN

No necesita usar JQuery , solo hace que la función javascript itere y vea todos sus controles de casilla de verificación mucho más fácil, pero puede usar vainilla javascript si lo desea.

Aquí hay un ejemplo que encontré en: Enlace al original

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

Nota al margen : JQuery es solo un pequeño archivo js que debe agregar a su página. Una vez que lo tenga incluido, puede usar todos los JQuery que desee. No hay nada que instalar y será totalmente compatible con la próxima versión de Visual Studio, creo.

Respondida el 18/07/2009 a las 02:33
fuente por usuario

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

Respondida el 18/07/2009 a las 03:22
fuente por usuario

votos
13

Aquí está un limpiador jQuery aplicación que permite a un ClientValidationFunction para cualquier número de CheckBoxList controles 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, por último, el validador personalizado que permite la función de cliente para recuperar el control de destino 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);
    }
}
Respondida el 25/10/2010 a las 15:59
fuente por usuario

votos
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: Comprobar si una casilla de verificación está activada en un grupo de casillas de verificación en clientside

Respondida el 16/08/2013 a las 16:20
fuente por usuario

votos
0

Puede utilizar una CustomValidatorpara que con un poco de 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>

Y para una 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>
Respondida el 31/03/2017 a las 09:55
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more