Как я могу сделать флажок обязательным на ASP.NET форма?
Я сделал несколько поиск, и я нашел несколько ответов, но ничего, что дает мне теплое нечеткое "это правильный способ сделать это". Чтобы ответить на наиболее часто встречающуюся жалобу на этот вопрос:" флажки могут иметь два законных состояния - проверенные и непроверенные", это " я принимаю условия и положения..."флажок, который должен быть установлен для завершения регистрации, следовательно, флажок требуется из бизнес-логики точка зрения.
пожалуйста, предоставьте полный cut-n-paste готовые фрагменты кода с вашим ответом! Я знаю, что есть несколько частей для этого-CustomValidator (предположительно), код позади, некоторый javascript и, возможно, проверка IsValid, и разочаровывающая часть для меня заключается в том, что в каждом примере, который я видел, одна из этих критических частей отсутствует!
6 ответов:
функция javascript для проверки на стороне клиента (с помощью jQuery)...
function CheckBoxRequired_ClientValidate(sender, e) { e.IsValid = jQuery(".AcceptedAgreement input:checkbox").is(':checked'); }
code-behind для проверки на стороне сервера...
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... }
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; }
Если вам нужен истинный валидатор, который не полагается на 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>"; } }
ответ Скотта будет работать для классов флажков. Если вы хотите отдельные флажки, вы должны быть немного хитрее. Если вы просто делаете одну коробку, лучше сделать это с идентификаторами. Этот пример делает это с помощью определенных флажков и не требует jQuery. Это также хороший маленький пример того, как вы можете получить эти досадные идентификаторы элементов управления в свой Javascript.
The .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>
и 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
Я обычно выполняю проверку на стороне клиента:
<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>
не 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 : (