Bagaimana cara membuat kotak centang yang diperlukan pada formulir ASP.NET?

112

Saya telah melakukan beberapa pencarian tentang ini, dan saya telah menemukan beberapa jawaban parsial, namun tidak ada yang memberi saya jawaban yang kabur "ini adalah cara yang tepat untuk melakukan ini". Untuk menjawab keluhan yang paling sering terjadi terhadap pertanyaan ini: "kotak centang dapat memiliki dua status sah - dicentang dan tidak dicentang", ini adalah kotak centang "Saya menerima persyaratan dan ketentuan ..." yang harus dicentang untuk menyelesaikan pendaftaran, oleh karena itu, diperlukan centang pada kotak dari sudut pandang logika bisnis.

Harap berikan potongan kode siap tempel lengkap dengan tanggapan Anda! Saya tahu ada beberapa bagian untuk ini - CustomValidator (mungkin), kode-di belakang, beberapa javascript dan mungkin pemeriksaan untuk IsValid, dan bagian yang membuat frustrasi bagi saya adalah bahwa dalam setiap contoh yang pernah saya lihat, salah satunya kritis potongan hilang!

Bob Kaufman
sumber

Jawaban:

216

fungsi javascript untuk validasi sisi klien (menggunakan jQuery) ...

function CheckBoxRequired_ClientValidate(sender, e)
{
    e.IsValid = jQuery(".AcceptedAgreement input:checkbox").is(':checked');
}

kode-di belakang untuk validasi sisi server ...

protected void CheckBoxRequired_ServerValidate(object sender, ServerValidateEventArgs e)
{
    e.IsValid = MyCheckBox.Checked;
}

Kode ASP.Net untuk kotak centang & validator ...

<asp:CheckBox runat="server" ID="MyCheckBox" CssClass="AcceptedAgreement" />
<asp:CustomValidator runat="server" ID="CheckBoxRequired" EnableClientScript="true"
    OnServerValidate="CheckBoxRequired_ServerValidate"
    ClientValidationFunction="CheckBoxRequired_ClientValidate">You must select this box to proceed.</asp:CustomValidator>

dan terakhir, di pos balik Anda - baik dari tombol atau apa pun ...

if (Page.IsValid)
{
    // your code here...
}
Scott Ivey
sumber
Saya mungkin melakukan sesuatu yang salah. Saya akan terus menyelidiki di bagian akhir, namun ControlToValidate = "<id-of-checkbox-control>" membuang pengecualian "Kontrol <id-of-checkbox-control> yang direferensikan oleh properti ControlToValidate tidak dapat divalidasi." Yang merusak javascript, dll.
Bob Kaufman
2
ahh benar. Hapus saja - CheckBox tidak mengimplementasikan antarmuka yang benar untuk mengikatnya. Validator akan tetap berfungsi dengan baik tanpa set properti itu. Saya akan memperbarui contoh saya sesuai dengan itu.
Scott Ivey
2
Parameter CustomValidator untuk nama fungsi javascript harus 'ClientValidationFunction', bukan 'OnClientValidate'. Lihat: msdn.microsoft.com/en-us/library/9eee01cx(v=VS.100).aspx
Chris
1
Saya akan menyarankan menggunakan jQuery("#<%= MyCheckBox.ClientID %>")alih-alih jQuery(".AcceptedAgreement input:checkbox")menjadi lebih eksplisit di mana elemen yang Anda coba pengaruhi.
Jesse Webb
3
Saya awalnya tidak memperhatikan bahwa tidak ada atribut ControlToValidate. Memasukkan atribut ini menyebabkan pengecualian, jadi kata peringatan bagi orang lain yang mungkin juga melewatkannya.
MicrosoftAccessPros.com
19

Versi C # dari jawaban Andrew:

<asp:CustomValidator ID="CustomValidator1" runat="server" 
        ErrorMessage="Please accept the terms..." 
        onservervalidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
    <asp:CheckBox ID="CheckBox1" runat="server" />

Kode di belakang:

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
    args.IsValid = CheckBox1.Checked;
}
John Rasch
sumber
terima kasih untuk versi C #. Penggunaan yang baik untuk meminimalkan kode juga.
andrewWinn
13

Jika Anda menginginkan validator sejati yang tidak bergantung pada jquery dan menangani validasi sisi server juga (dan Anda harus. Validasi sisi server adalah bagian terpenting) maka di sini adalah kontrol

public class RequiredCheckBoxValidator : System.Web.UI.WebControls.BaseValidator
{
    private System.Web.UI.WebControls.CheckBox _ctrlToValidate = null;
    protected System.Web.UI.WebControls.CheckBox CheckBoxToValidate
    {
        get
        {
            if (_ctrlToValidate == null)
                _ctrlToValidate = FindControl(this.ControlToValidate) as System.Web.UI.WebControls.CheckBox;

            return _ctrlToValidate;
        }
    }

    protected override bool ControlPropertiesValid()
    {
        if (this.ControlToValidate.Length == 0)
            throw new System.Web.HttpException(string.Format("The ControlToValidate property of '{0}' is required.", this.ID));

        if (this.CheckBoxToValidate == null)
            throw new System.Web.HttpException(string.Format("This control can only validate CheckBox."));

        return true;
    }

    protected override bool EvaluateIsValid()
    {
        return CheckBoxToValidate.Checked;
    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (this.Visible && this.Enabled)
        {
            System.Web.UI.ClientScriptManager cs = this.Page.ClientScript;
            if (this.DetermineRenderUplevel() && this.EnableClientScript)
            {
                cs.RegisterExpandoAttribute(this.ClientID, "evaluationfunction", "cb_verify", false);
            }
            if (!this.Page.ClientScript.IsClientScriptBlockRegistered(this.GetType().FullName))
            {
                cs.RegisterClientScriptBlock(this.GetType(), this.GetType().FullName, GetClientSideScript());
            } 
        }
    }

    private string GetClientSideScript()
    {
        return @"<script language=""javascript"">function cb_verify(sender) {var cntrl = document.getElementById(sender.controltovalidate);return cntrl.checked;}</script>";
    }
}
CirrusABS
sumber
Ini adalah satu-satunya jawaban yang akan bekerja pada lebih dari satu Kotak Centang dalam sebuah formulir, daripada membutuhkan 1 fungsi per setiap objek. Sabas!
haliphax
Terima kasih banyak. Saya membutuhkan cara untuk melakukan ini dengan beberapa kontrol yang dirender secara dinamis. Mengagumkan.
schmosef
Meskipun solusi yang dipilih dari Scott benar / valid, saya yakin ini adalah solusi yang lebih lengkap. Kontrol kustom ini seharusnya sudah dimasukkan ke dalam framework. Terima kasih CirrusABS!
Gabe
5

Jawaban Scott akan berfungsi untuk kelas kotak centang. Jika Anda ingin kotak centang satu per satu, Anda harus sedikit lebih licik. Jika Anda hanya melakukan satu kotak, lebih baik melakukannya dengan ID. Contoh ini melakukannya dengan kotak centang khusus dan tidak memerlukan jQuery. Ini juga merupakan contoh kecil yang bagus tentang bagaimana Anda bisa mendapatkan ID kontrol sial itu ke dalam Javascript Anda.

.Ascx:

<script type="text/javascript">

    function checkAgreement(source, args)
    {                
        var elem = document.getElementById('<%= chkAgree.ClientID %>');
        if (elem.checked)
        {
            args.IsValid = true;
        }
        else
        {        
            args.IsValid = false;
        }
    }

    function checkAge(source, args)
    {
        var elem = document.getElementById('<%= chkAge.ClientID %>');
        if (elem.checked)
        {
            args.IsValid = true;
        }
        else
        {
            args.IsValid = false;
        }    
    }

</script>

<asp:CheckBox ID="chkAgree" runat="server" />
<asp:Label AssociatedControlID="chkAgree" runat="server">I agree to the</asp:Label>
<asp:HyperLink ID="lnkTerms" runat="server">Terms & Conditions</asp:HyperLink>
<asp:Label AssociatedControlID="chkAgree" runat="server">.</asp:Label>
<br />

<asp:CustomValidator ID="chkAgreeValidator" runat="server" Display="Dynamic"
    ClientValidationFunction="checkAgreement">
    You must agree to the terms and conditions.
    </asp:CustomValidator>

<asp:CheckBox ID="chkAge" runat="server" />
<asp:Label AssociatedControlID="chkAge" runat="server">I certify that I am at least 18 years of age.</asp:Label>        
<asp:CustomValidator ID="chkAgeValidator" runat="server" Display="Dynamic"
    ClientValidationFunction="checkAge">
    You must be 18 years or older to continue.
    </asp:CustomValidator>

Dan codebehind:

Protected Sub chkAgreeValidator_ServerValidate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ServerValidateEventArgs) _
Handles chkAgreeValidator.ServerValidate
    e.IsValid = chkAgree.Checked
End Sub

Protected Sub chkAgeValidator_ServerValidate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ServerValidateEventArgs) _
Handles chkAgeValidator.ServerValidate
    e.IsValid = chkAge.Checked
End Sub
jorelli
sumber
3

Saya biasanya melakukan validasi di sisi klien:

<asp:checkbox id="chkTerms" text=" I agree to the terms" ValidationGroup="vg" runat="Server"  />
<asp:CustomValidator id="vTerms"
                ClientValidationFunction="validateTerms" 
                ErrorMessage="<br/>Terms and Conditions are required." 
                ForeColor="Red"
                Display="Static"
                EnableClientScript="true"
                ValidationGroup="vg"
                runat="server"/>

<asp:Button ID="btnSubmit" OnClick="btnSubmit_Click" CausesValidation="true" Text="Submit" ValidationGroup="vg" runat="server" />

<script>
    function validateTerms(source, arguments) {
        var $c = $('#<%= chkTerms.ClientID %>');
        if($c.prop("checked")){
            arguments.IsValid = true;
        } else {
            arguments.IsValid = false;
        }
    }
</script>       
rampok
sumber
Salah satu solusi terbaik karena tidak Postback.
nu everest
Masalahnya adalah bahwa pesan validator tidak hilang jika Anda mengirimkan, lalu coba dan centang kotaknya.
MC9000
-1

Cara non-javascript. . halaman aspx:

 <form id="form1" runat="server">
<div>
    <asp:CheckBox ID="CheckBox1" runat="server" />
    <asp:CustomValidator ID="CustomValidator1"
        runat="server" ErrorMessage="CustomValidator" ControlToValidate="CheckBox1"></asp:CustomValidator>
</div>
</form>

Kode Belakang:

Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
    If Not CheckBox1.Checked Then
        args.IsValid = False
    End If
End Sub

Untuk tindakan apa pun yang mungkin Anda perlukan (Aturan Bisnis):

If Page.IsValid Then
   'do logic
End If 

Maaf untuk kode VB. . . Anda dapat mengubahnya menjadi C # jika itu kesenangan Anda. Perusahaan tempat saya bekerja saat ini membutuhkan VB :(

andrewWinn
sumber
3
Ini tidak akan berhasil, karena Anda tidak dapat melampirkan validator ke kotak centang! DOOOH!
0xDEAD BEEF