2009-08-04 18 views
100

Bu konuda araştırma yaptım ve birkaç kısmi cevap buldum, ancak bana bu sıcak bulanıklığı veren hiçbir şey "bunu yapmanın doğru yolu bu". Bu soruya en sık rastlanan şikayeti yanıtlamak için: "onay kutularının iki meşru durumu olabilir - kontrol edildi ve işaretlenmemiş", bu bir kaydı tamamlamak için kontrol edilmesi gereken "Şartları ve koşulları kabul ediyorum ..." onay kutusudur. Bu nedenle, kutunun kontrol edilmesi bir iş mantığı açısından gereklidir.ASP.NET formunda gereken onay kutularını nasıl yapabilirim?

Lütfen cevabınız ile birlikte eksiksiz kes-yapıştır hazır kod parçaları sağlayın! Bunun için birkaç parça olduğunu biliyorum - CustomValidator (muhtemelen), arkasındaki kod, bazı javascript ve muhtemelen IsValid için bir kontrol, ve benim için sinir bozucu kısım, gördüğüm her örnekte bu kritiklerden biri. parçalar eksik!

cevap

198

gerektirir istemci tarafı doğrulama (jQuery kullanarak) için JavaScript işlevi ...

arka plan kod sunucu tarafında doğrulama için
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; 
} 
Onay kutusu & doğrulayıcı için

ASP.Net kodu ...

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

ve yüzgeç müttefiki senin geri gönderme içinde - andrew cevabın

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

Kod dahil olmak üzere tam ve doğru cevap; s. – maxbeaudoin

+0

Muhtemelen yanlış bir şeyler yapıyorum. Sonunda araştırmaya devam edeceğim, ancak ControlToValidate = "" istisna atar "ControlToValidate özelliği tarafından başvurulan denetimin doğrulanamadı." Hangi javascript, vb –

+2

ahh, sağa kırar. Sadece bunu kaldır - CheckBox onu bağlamak için doğru arayüzü uygulamıyor. Doğrulayıcı, bu özellik kümesi olmadan yine de iyi çalışır. Örneğimi buna göre güncelleyeceğim. –

-1

Javascript dışı yol. . aspx sayfası:

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

Kod Arkası: İhtiyacınız her türlü eylem (iş kuralları) için

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 

: VB kodu için

If Page.IsValid Then 
    'do logic 
End If 

üzgünüm. . . eğer zevkiniz buysa C# 'ye dönüştürebilirsiniz. Şu an için çalışıyorum şirket VB :(

+3

Bu işe yaramaz onay kutusu! DOOOH! –

17

C# sürümü ... bir düğme ya da her türlü olsun:

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

kod arkadaki:

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

teşekkürler. Kodu da en aza indirgemek için iyi bir yol. – andrewWinn

3

Scott'ın cevabı çalışacak onay kutularının sınıfları için. Tek tek onay kutularını istiyorsanız, küçük bir sneakier olmalısınız. Sadece bir kutu yapıyorsanız, kimlikleri ile bunu yapmak daha iyidir. Bu örnek, belirli onay kutularıyla yapar ve jQuery gerektirmez. Ayrıca bu sinir bozucu kontrol kimliklerini Javascript'inize nasıl alabileceğinize dair güzel bir örnek.

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

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

Eğer jquery güvenmek ve hem de sunucu tarafında doğrulama kolları (ve gerektiği olmayan bir gerçek doğrulayıcı istiyorum.Sunucu tarafı doğrulama buraya yazıp) en önemli parçasıdır

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

Bu, her nesne için 1 işlev yerine, bir formda birden çok CheckBox üzerinde çalışacak tek yanıttır. Huzzah! – haliphax

+0

Çok teşekkür ederim. Bunu dinamik olarak oluşturulmuş çok sayıda denetimle yapmanın bir yoluna ihtiyacım vardı. Muhteşem. – schmosef

2

Genellikle istemci tarafında doğrulama gerçekleştirmek bir kumandayı şudur: hiç doğrulayıcı ekleyemezsiniz beri

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

Geri gönderilmediği için en iyi çözümlerden biri. –

İlgili konular