ฉันจะสร้างช่องทำเครื่องหมายที่จำเป็นในแบบฟอร์ม ASP.NET ได้อย่างไร?


112

ฉันได้ค้นหาสิ่งนี้และพบคำตอบบางส่วนหลายข้อ แต่ไม่มีสิ่งใดที่ทำให้ฉันรู้สึกคลุมเครือ "นี่เป็นวิธีที่ถูกต้องในการทำ" ในการตอบข้อร้องเรียนที่เกิดขึ้นบ่อยที่สุดสำหรับคำถามนี้: "ช่องทำเครื่องหมายสามารถมีสองสถานะที่ถูกต้อง - เลือกและไม่เลือก" นี่คือช่องทำเครื่องหมาย "ฉันยอมรับข้อกำหนดในการให้บริการ ... " ซึ่งจะต้องตรวจสอบเพื่อทำการลงทะเบียนให้เสร็จสมบูรณ์ ดังนั้นการทำเครื่องหมายในช่องจึงจำเป็นต้องใช้จากมุมมองของตรรกะทางธุรกิจ

โปรดระบุชิ้นส่วนโค้ดที่พร้อมตัดและวางพร้อมคำตอบของคุณ! ฉันรู้ว่ามีหลายส่วนสำหรับสิ่งนี้ - CustomValidator (น่าจะเป็น) โค้ดที่อยู่เบื้องหลังจาวาสคริปต์และอาจเป็นการตรวจสอบ IsValid และส่วนที่น่าหงุดหงิดสำหรับฉันคือในแต่ละตัวอย่างที่ฉันเห็นหนึ่งในสิ่งสำคัญเหล่านี้ ชิ้นส่วนหายไป!

คำตอบ:


216

ฟังก์ชัน javascript สำหรับการตรวจสอบฝั่งไคลเอ็นต์ (โดยใช้ jQuery) ...

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

รหัสหลังสำหรับการตรวจสอบฝั่งเซิร์ฟเวอร์ ...

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

รหัส ASP.Net สำหรับช่องทำเครื่องหมาย & ตัวตรวจสอบ ...

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

และสุดท้ายในการโพสต์แบ็คของคุณ - ไม่ว่าจะจากปุ่มหรืออะไรก็ตาม ...

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

ฉันคงทำอะไรผิด ในตอนท้ายฉันจะดำเนินการตรวจสอบต่อไป แต่ ControlToValidate = "<id-of-checkbox-control>" มีข้อยกเว้น "Control <id-of-checkbox-control> ที่อ้างถึงโดยคุณสมบัติ ControlToValidate ไม่สามารถตรวจสอบได้" ซึ่งทำลายจาวาสคริปต์ ฯลฯ
Bob Kaufman

2
อ่าใช่ เพียงแค่ลบออก - CheckBox ไม่ได้ใช้อินเทอร์เฟซที่ถูกต้องเพื่อเชื่อมต่อ ตัวตรวจสอบจะยังคงทำงานได้ดีโดยไม่มีการตั้งค่าคุณสมบัตินั้น ฉันจะอัปเดตตัวอย่างของฉันตามนั้น
Scott Ivey

2
พารามิเตอร์ CustomValidator สำหรับชื่อฟังก์ชันจาวาสคริปต์ควรเป็น "ClientValidationFunction" ไม่ใช่ "OnClientValidate" ดู: msdn.microsoft.com/en-us/library/9eee01cx(v=VS.100).aspx
Chris

1
ฉันขอแนะนำให้ใช้jQuery("#<%= MyCheckBox.ClientID %>")แทนjQuery(".AcceptedAgreement input:checkbox")เพื่อให้ชัดเจนยิ่งขึ้นในองค์ประกอบที่คุณพยายามจะส่งผลกระทบ
Jesse Webb

3
ในตอนแรกฉันไม่ได้สังเกตว่าไม่มีแอตทริบิวต์ ControlToValidate การรวมแอตทริบิวต์นี้ทำให้เกิดข้อยกเว้นดังนั้นคำเตือนสำหรับผู้อื่นที่อาจพลาดสิ่งนั้น
MicrosoftAccessPros.com

19

คำตอบของ Andrew รุ่น C #:

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

behind รหัส:

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

ขอบคุณสำหรับรุ่น C # ใช้การย่อโค้ดให้น้อยที่สุดด้วย
andrewWinn

13

หากคุณต้องการตัวตรวจสอบความถูกต้องที่แท้จริงที่ไม่ต้องพึ่งพา jquery และจัดการการตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์ด้วย (และคุณควรตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์เป็นส่วนที่สำคัญที่สุด) นี่คือส่วนควบคุม

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

นี่เป็นคำตอบเดียวที่จะทำงานบน CheckBox มากกว่าหนึ่งรายการในรูปแบบแทนที่จะต้องการ 1 ฟังก์ชันต่อแต่ละวัตถุ Huzzah!
haliphax

ขอบคุณมาก. ฉันต้องการวิธีดำเนินการนี้โดยใช้การควบคุมที่แสดงผลแบบไดนามิกหลายรายการ น่ากลัว
schmosef

แม้ว่าโซลูชันที่เลือกจาก Scott จะถูกต้อง / ใช้ได้ แต่ฉันเชื่อว่านี่เป็นโซลูชันที่สมบูรณ์กว่า การควบคุมแบบกำหนดเองนี้ควรได้รับการอบในกรอบ ขอบคุณ CirrusABS!
Gabe

5

คำตอบของ Scott จะใช้ได้กับช่องทำเครื่องหมายชั้นเรียน หากคุณต้องการช่องทำเครื่องหมายแต่ละช่องคุณจะต้องมีความลับมากขึ้น หากคุณทำเพียงกล่องเดียวควรใช้ ID ตัวอย่างนี้ทำโดยกล่องกาเครื่องหมายเฉพาะและไม่ต้องใช้ jQuery นอกจากนี้ยังเป็นตัวอย่างเล็ก ๆ ที่ดีในการรับ ID ควบคุมที่น่ารำคาญเหล่านั้นลงใน Javascript ของคุณ

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

และรหัสหลัง:

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

โดยปกติฉันจะทำการตรวจสอบความถูกต้องในฝั่งไคลเอ็นต์:

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

หนึ่งในวิธีแก้ปัญหาที่ดีที่สุดเนื่องจากไม่มี Postback
nu everest

ปัญหานี้คือข้อความตัวตรวจสอบความถูกต้องจะไม่หายไปหากคุณส่งให้ลองทำเครื่องหมายในช่อง
MC9000

-1

วิธีที่ไม่ใช้จาวาสคริปต์ . หน้า 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>

รหัสหลัง:

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

สำหรับการดำเนินการใด ๆ ที่คุณอาจต้องการ (กฎทางธุรกิจ):

If Page.IsValid Then
   'do logic
End If 

ขออภัยสำหรับรหัส VB . . คุณสามารถแปลงเป็น C # ได้หากเป็นความสุขของคุณ บริษัท ที่ฉันทำงานอยู่ตอนนี้ต้องการ VB :(


3
วิธีนี้ใช้ไม่ได้เนื่องจากคุณไม่สามารถแนบ validator กับช่องทำเครื่องหมายได้! DOOOH!
0xDEAD BEEF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.