2016-04-25 10 views
2

Ok iv gefolgt mehr als ein paar der CustomValidators für mehrere ASP CheckBox auf hier und auf ein paar anderen Websites und habe ein bisschen eine harte Zeit damit tatsächlich Validierung, wenn ein Kontrollkästchen aktiviert ist.CustomValidator woes

Während ich eine Vielzahl von Antworten ausprobiert habe, habe ich mich auf eine speziell festgelegt. Ich habe es an den Punkt gebracht, dass es in der Validierungszusammenfassung angezeigt wird, aber wenn die Kontrollkästchen aktiviert sind, werden sie immer noch in der Zusammenfassung angezeigt, dass sie nicht sind. Ich weiß nicht, was ich falsch gemacht habe oder ob ich etwas verpasst habe, aber ich hoffe, dass mir ein extra Augenpaar helfen kann, was ich verpasst habe.

CheckBox ist:

<div class="section"> 
    <span>2</span>Induction Checklist: 
</div> 
<div class="inner-wrap"> 
    <label>Introduction of relevant staff <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbStaffIntro" /></label> 
    <label>Comments: <asp:TextBox runat="server" ID="txtStaffIntroComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Location of all Exits <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbExitLocations" /></label> 
    <label>Comments: <asp:TextBox runat="server" ID="txtExitLocationComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Evacuation Assembly Point <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbEvacuationPoint" /></label> 
    <label>Comments: <asp:TextBox runat="server" ID="txtEvacuationPointComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Location of Fire Extinguishers <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbFireExtLocations" /></label> 
     <label>Comments: <asp:TextBox runat="server" ID="txtFireExtLocationsComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Location of Fire Hoses <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbFireHoseLoc" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtFireHoseLocComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Location of First Aid Kits <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbFirstAidLoc" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtFirstAidLocComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
     <label>Location of Male/Female Toilets <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbLooLoc" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtLooLocComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Location of Lunch Rooms <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbLuncLoc" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtLunchLocComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Explain "No-Smoking" Policy in all Offices and Buildings <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbNoSmoke" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtNoSmokeComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Explain and Indicate "No-Go" Zones in Warehouse <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbNoGo" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtNoGoComment" /></label> 
</div> <!-- end inner-wrap --> 

<div class="inner-wrap"> 
    <label>Other <asp:CheckBox CssClass="HitCheckbox" ValidationGroup="checkList" runat="server" ID="cbOther" /></label> 
    <label>Comment: <asp:TextBox runat="server" ID="txtOtherComment" /></label> 
</div> <!-- end inner-wrap --> 

Client-seitige Validierung:

<script> 
function CheckBoxRequired_ClientValidate(sender, e) 
{ 
    e.IsValid = jQuery(".HitCheckBox input:checkbox").is(':checked'); 
} 
</script> 

Server Side Validierung:

public void Required_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    args.IsValid = (cbStaffIntro.Checked); 
    args.IsValid = (cbExitLocations.Checked); 
    args.IsValid = (cbEvacuationPoint.Checked); 
    args.IsValid = (cbFireExtLocations.Checked); 
    args.IsValid = (cbFireHoseLoc.Checked); 
    args.IsValid = (cbFirstAidLoc.Checked); 
    args.IsValid = (cbLooLoc.Checked); 
    args.IsValid = (cbLuncLoc.Checked); 
    args.IsValid = (cbNoSmoke.Checked); 
    args.IsValid = (cbNoGo.Checked); 
} 

Individuelle Validatoren:

<!-- Checklist Validation Section cbStaffIntro --> 
<asp:CustomValidator runat="server" ID="CustomValidatorSi" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Introduction to relevant Staff Not Completed!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorEl" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Emergancy Exit Locations Not Completed!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorEp" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Evacuation Point Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorFe" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Fire Extinguisher Locations Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorFh" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Fire Hose Locations Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorFa" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="First Aid Locations Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorToilet" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Toilet Locations Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorLr" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="Lunchroom Location Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorNsp" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="No Smoking Policy Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 
<asp:CustomValidator runat="server" ID="CustomValidatorNg" ValidateEmptyText="true" ValidationGroup="checkList" EnableClientScript="true" Display="None" ErrorMessage="'No-Go' Zones Not Covered!" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 

Die Art und Weise, ich wünsche, dass dies funktioniert, sind alle Kontrollkästchen, mit Ausnahme der mit "Andere" markiert, müssen ausgewählt werden, bevor das Formular validiert wird.

Wie bereits erwähnt, habe ich dies bis zu dem Punkt, dass sie in der Validierungszusammenfassung angezeigt werden, wenn sie nicht überprüft werden. Worüber ich Probleme habe ist, warum sie immer noch als nicht überprüft in der Validierungszusammenfassung angezeigt werden, wenn sie überprüft werden.

Was fehlt hier? oder ist was ich danach nicht möglich bin? Bevor ich vergesse, verwende ich .NET Framework 4 für dieses Projekt.

EDIT: Danke an Scotty für ihre Bemühungen, mir bei diesem Problem zu helfen. Nach dem Anwenden des Fixes musste ich auch die Javascript-Validierung entfernen, um den Code nach Bedarf funktionieren zu lassen.

+1

Warum nicht einfach einen ‚erforderlich‘ -Attribut (außer anderen) auf jedem des Kontrollkästchen enthält? – abramlimpin

+0

@abramlimpin: das klappt leider nicht. –

Antwort

3

Sie sehen, die Errormessages aus allen CustomValidators wie Sie die gleichen Server-Seite-Methode verwenden Required_ServerValidate alle Ihre CustomValidator Kontrollen zu überprüfen und werden nicht dynamisch den Aufbau Ihrer Errormessage.

Sie müssen Ihre Logik ändern, um Ihre Fehlermeldungen für jede Bedingung dynamisch zu erstellen.

Zuerst entfernen Sie alle Ihre CustomValidators bis auf eine, dann ändern Sie Ihren Code wie folgt.

Hier ist ein Ansatz ...

ASPX

<asp:CustomValidator runat="server" ID="cvCheckList" ValidationGroup="checkList" EnableClientScript="true" Display="None" OnServerValidate="Required_ServerValidate" ClientValidationFunction="CheckBoxRequired_ClientValidate" /> 

Stellen Sie sicher, DisplayMode="SingleParagraph" in Ihrem Validation verwenden, um die HTML richtig macht.

Code hinter

public void Required_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    args.IsValid = true; 

    var sb = new StringBuilder(); 
    sb.Append("<ul>"); 

    if (!cbStaffIntro.Checked) 
     AppendErrorMessage(args, sb, "Introduction to relevant Staff Not Completed!"); 

    if (!cbExitLocations.Checked) 
     AppendErrorMessage(args, sb, "Emergency Exit Locations Not Completed!"); 

    if (!cbEvacuationPoint.Checked) 
     AppendErrorMessage(args, sb, "Evacuation Point Not Covered!"); 

    if (!cbFireExtLocations.Checked) 
     AppendErrorMessage(args, sb, "Fire Extinguisher Locations Not Covered!"); 

    if (!cbFireHoseLoc.Checked) 
     AppendErrorMessage(args, sb, "Fire Hose Locations Not Covered!"); 

    if (!cbFirstAidLoc.Checked) 
     AppendErrorMessage(args, sb, "First Aid Locations Not Covered!"); 

    if (!cbLooLoc.Checked) 
     AppendErrorMessage(args, sb, "Toilet Locations Not Covered!"); 

    if (!cbLuncLoc.Checked) 
     AppendErrorMessage(args, sb, "Lunchroom Location Not Covered!"); 

    if (!cbNoSmoke.Checked) 
     AppendErrorMessage(args, sb, "No Smoking Policy Not Covered!"); 

    if (!cbNoGo.Checked) 
     AppendErrorMessage(args, sb, "'No-Go' Zones Not Covered!"); 

    sb.Append("</ul>"); 
    cvCheckList.ErrorMessage = sb.ToString(); 
} 

private static void AppendErrorMessage(ServerValidateEventArgs args, StringBuilder sb, string message) 
{ 
    args.IsValid = false; 
    sb.AppendFormat("<li>{0}</li>", message); 
} 

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    Page.Validate(); 
    if (Page.IsValid) 
     Response.Redirect("ValidationSuccessful.aspx"); 
} 
+0

Refactored meinen ursprünglichen Code :) – Scotty

+0

Ich habe meinen Code geändert, um zu reflektieren, was Sie hier gezeigt haben, um zu testen. Leider scheint es nicht zu funktionieren. Es scheint, dass die Validierung irgendwo entlang der Linie stattfindet, aber selbst wenn alle erforderlichen Checkboxen gefüllt und andere Validierungskriterien erfüllt sind, scheint etwas als nicht gültig markiert zu sein. Auch die Nachrichten erscheinen überhaupt nicht in der Validierungszusammenfassung. –

+0

Das obige funktioniert für mich auf einer Testseite, die ich mit Ihrem Code eingerichtet habe. Dinge zu überprüfen ... 1) hat Ihre ValidationSummary eine ValidationGroup? Es muss dasselbe wie Ihr CustomValidator sein, d. H. ValidationGroup = "checkList"? 2) Haben Sie die ErrorMessage von Ihrem einzelnen CustomValidator in Ihrem ASPX entfernt? 3) Wenn Sie am Anfang der Required_ServerValidate-Methode einen Haltepunkt setzen, senden Sie das Formular. Fällt es tatsächlich auf den Haltepunkt? Wenn Sie den Code durchlaufen, funktioniert die Logik? Lass mich wissen, wie du gehst. – Scotty