Làm cách nào để tạo hộp kiểm bắt buộc trên biểu mẫu ASP.NET?


112

Tôi đã thực hiện một số tìm kiếm về vấn đề này và tôi đã tìm thấy một số câu trả lời từng phần, tuy nhiên không có gì khiến tôi cảm thấy khó chịu rằng "đây là cách đúng đắn để làm điều này". Để trả lời khiếu nại xảy ra thường xuyên nhất đối với câu hỏi này: "hộp kiểm có thể có hai trạng thái hợp pháp - được chọn và không được chọn", đây là hộp kiểm "Tôi chấp nhận các điều khoản và điều kiện ...", phải được chọn để hoàn tất đăng ký, do đó việc chọn hộp là bắt buộc theo quan điểm logic nghiệp vụ.

Vui lòng cung cấp các đoạn mã đã sẵn sàng cắt n-dán hoàn chỉnh cùng với phản hồi của bạn! Tôi biết có một số vấn đề liên quan đến vấn đề này - CustomValidator (có lẽ là), mã phía sau, một số javascript và có thể là kiểm tra IsValid, và phần khó chịu đối với tôi là trong mỗi ví dụ tôi đã thấy, một trong những mảnh bị thiếu!

Câu trả lời:


216

hàm javascript để xác thực phía máy khách (sử dụng jQuery) ...

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

mã phía sau để xác thực phía máy chủ ...

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

Mã ASP.Net cho hộp kiểm & trình xác thực ...

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

và cuối cùng, trong bài đăng lại của bạn - cho dù từ một nút hay bất cứ điều gì ...

if (Page.IsValid)
{
    // your code here...
}

Có lẽ tôi đang làm gì đó sai. Tôi sẽ tiếp tục điều tra ở cuối của mình, tuy nhiên ControlToValidate = "<id-of-checkbox-control>" ném ngoại lệ "Control <id-of-checkbox-control> được tham chiếu bởi thuộc tính ControlToValidate không thể được xác thực." Mà phá vỡ javascript vv
Bob Kaufman

2
à, đúng rồi. Chỉ cần loại bỏ điều đó - CheckBox không triển khai giao diện chính xác để kết nối nó. Trình xác thực sẽ vẫn chạy tốt mà không có thuộc tính đó được đặt. Tôi sẽ cập nhật ví dụ của tôi cho phù hợp.
Scott Ivey

2
Tham số CustomValidator cho tên hàm javascript phải là 'ClientValidationFunction', không phải 'OnClientValidate'. Xem: msdn.microsoft.com/en-us/library/9eee01cx(v=VS.100).aspx
Chris

1
Tôi khuyên bạn nên sử dụng jQuery("#<%= MyCheckBox.ClientID %>")thay vì jQuery(".AcceptedAgreement input:checkbox")để rõ ràng hơn về yếu tố mà bạn đang cố gắng ảnh hưởng.
Jesse Webb

3
Ban đầu tôi không nhận thấy rằng không có thuộc tính ControlToValidate. Bao gồm thuộc tính này gây ra một ngoại lệ, do đó, một lời cảnh báo cho những người khác cũng có thể bỏ lỡ điều đó.
MicrosoftAccessPros.com

19

Phiên bản C # của câu trả lời của andrew:

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

Mã ẩn:

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
    args.IsValid = CheckBox1.Checked;
}

cảm ơn vì phiên bản C #. Sử dụng tốt việc giảm thiểu mã quá.
andrewWinn

13

Nếu bạn muốn một trình xác thực thực sự không dựa vào jquery và cũng xử lý xác thực phía máy chủ (và bạn nên làm vậy. Xác thực phía máy chủ là phần quan trọng nhất) thì đây là một điều khiển

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

Đây là câu trả lời duy nhất sẽ hoạt động trên nhiều CheckBox trong một biểu mẫu, thay vì cần 1 hàm cho mỗi đối tượng. Huzzah!
haliphax

Cảm ơn rât nhiều. Tôi cần một cách để thực hiện việc này với nhiều điều khiển được hiển thị động. Tuyệt vời.
schmosef

Mặc dù giải pháp được chọn từ Scott là đúng / hợp lệ, nhưng tôi tin rằng đây là giải pháp hoàn chỉnh hơn. Điều khiển tùy chỉnh này nên được đưa vào khuôn khổ. Cảm ơn CirrusABS!
Gabe

5

Câu trả lời của Scott sẽ phù hợp với các lớp hộp kiểm. Nếu bạn muốn các hộp kiểm riêng lẻ, bạn phải lén lút hơn một chút. Nếu bạn chỉ làm một hộp, tốt hơn nên làm điều đó với ID. Ví dụ này thực hiện điều đó bằng các hộp kiểm cụ thể và không yêu cầu jQuery. Đây cũng là một ví dụ nhỏ về cách bạn có thể lấy các ID điều khiển khó chịu đó vào Javascript của mình.

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

Và mã phía sau:

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

3

Tôi thường thực hiện xác thực ở phía máy khách:

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

Một trong những giải pháp tốt nhất vì nó không đăng lại.
nu everest

Vấn đề với điều này là thông báo trình xác thực không biến mất nếu bạn gửi, sau đó hãy thử và chọn hộp.
MC9000

-1

Cách không javascript. . trang 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>

Mã ẩn:

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

Đối với bất kỳ hành động nào bạn có thể cần (Quy tắc kinh doanh):

If Page.IsValid Then
   'do logic
End If 

Xin lỗi vì mã VB. . . bạn có thể chuyển nó sang C # nếu đó là niềm vui của bạn. Công ty tôi đang làm việc hiện tại yêu cầu VB :(


3
Điều này sẽ không hoạt động, vì bạn không thể đính kèm trình xác thực vào hộp kiểm! DOOOH!
0xDEAD BEEF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.