2009-08-04 89 views
100

我已经做了一些搜索,我发现了几个部分的答案,但没有什么能给我带来温暖的模糊“这是做这件事的正确方法”。要回答针对此问题最频繁发生的投诉:“复选框可以有两种合法状态 - 已选中或未选中”,这是“我接受条款和条件...”复选框,必须对其进行检查才能完成注册,因此从业务逻辑的角度来看,需要检查该框。如何在ASP.NET表单上创建复选框?

请在回复中提供完整的剪切粘贴准备好代码段!我知道这有几个部分 - CustomValidator(推测是),代码隐藏,一些JavaScript和可能的IsValid检查,对我来说令人沮丧的是,在我看到的每个示例中,其中一个关键件丢失了!

回答

198

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... 
} 
+8

完整且正确的答案,包括代码; p。 – maxbeaudoin 2009-08-04 15:41:37

+0

我可能做错了什么。我将继续在我的最后调查,但是ControlToValidate =“”引发异常“ControlToValidate属性引用的Control 无法验证。其中打破了JavaScript等 – 2009-08-04 16:17:33

+2

啊,对。只要删除 - CheckBox没有实现正确的界面来绑定它。如果没有该属性集合,验证器仍然可以正常运行。我会相应地更新我的示例。 – 2009-08-04 16:18:47

-1

非javascript方式。 。 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

这是行不通的,因为你不能附加验证程序复选框! DOOOH! – 2011-08-01 12:07:09

17

C#安德鲁的回答版本:

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

代码隐藏:

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

斯科特的答案将工作用于复选框的类。如果你想单独的复选框,你必须有点偷偷摸摸。如果你只是在做一个盒子,最好用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 
9

如果希望不依赖于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>"; 
    } 
} 
2

我通常执行在客户端验证:

<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>  
相关问题