Проблемы CustomValidator

Хорошо, я следил за более чем несколькими CustomValidators для нескольких флажков asp здесь и на нескольких других сайтах, и у меня немного проблемы с его фактической проверкой, когда флажок установлен.

Пока я пробовал множество ответов, я остановился на одном, в частности. Я дошел до того, что он будет отображаться в сводке проверки, но когда флажки отмечены, они все равно отображаются в сводке, а это не так. Я не знаю, что я сделал не так, или я что-то пропустил, но я надеюсь, что дополнительная пара глаз поможет мне с тем, что я пропустил.

Флажки:

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

Проверка на стороне клиента:

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

Проверка на стороне сервера:

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

Пользовательские валидаторы:

<!-- 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" />

Я хочу, чтобы это работало так, чтобы все флажки, кроме одного, отмеченного «Другое», должны быть выбраны до проверки формы.

Как уже упоминалось, у меня это до такой степени, что они будут отображаться в сводке проверки, если они не проверены. У меня проблемы с тем, почему они все еще отображаются как непроверенные в сводке проверки, когда они проверяются.

Что мне здесь не хватает? или то, что мне нужно, не совсем возможно? Прежде чем я забуду, я использую .NET Framework 4 для этого проекта.

EDIT: Спасибо Скотти за помощь в решении этой проблемы. После применения предложенного исправления мне также пришлось удалить проверку Javascript, чтобы заставить код работать как нужно.


person Anthony Gilbert    schedule 25.04.2016    source источник
comment
Почему бы просто не включить «обязательный» атрибут (кроме других) в каждый из флажков?   -  person abramlimpin    schedule 26.04.2016
comment
@abramlimpin: к сожалению, это не работает.   -  person Anthony Gilbert    schedule 26.04.2016


Ответы (1)


Вы видите сообщения об ошибках от всех CustomValidator, поскольку используете один и тот же метод на стороне сервера Required_ServerValidate для проверки всех ваших элементов управления CustomValidator и не создаете сообщение об ошибке динамически.

Вам нужно изменить свою логику, чтобы динамически создавать сообщения об ошибках для каждого условия.

Во-первых, удалите все ваши CustomValidators, кроме одного, а затем измените свой код следующим образом.

Вот один из подходов...

ASPX

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

Make sure you use DisplayMode="SingleParagraph" in your ValidationSummary so the html renders properly.

Код

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");
}
person Scotty    schedule 26.04.2016
comment
Я изменил свой код, чтобы отразить то, что вы показали здесь для тестирования. К сожалению, похоже, это не работает. Кажется, что проверка происходит где-то вдоль линий, но даже при заполнении всех необходимых флажков и выполнении других критериев проверки кажется, что что-то помечено как недействительное. Также сообщения вообще не отображаются в сводке проверки. - person Anthony Gilbert; 26.04.2016
comment
Вышеупомянутое работает для меня на тестовой странице, которую я настроил с помощью вашего кода. Что нужно проверить... 1) есть ли у ValidationSummary группа ValidationGroup? Он должен совпадать с вашим CustomValidator, т.е. ValidationGroup=checkList? 2) Удалили ли вы ErrorMessage из вашего единственного CustomValidator в вашем ASPX? 3) Если вы поместите точку останова в начале метода Required_ServerValidate, отправьте форму, действительно ли она достигнет точки останова? Если вы пошагово пройдёте код, сработает ли логика? Дайте мне знать, как вы идете. - person Scotty; 26.04.2016
comment
Спасибо за ответ @Scotty. 1) Да, в ValidationSummary есть ValidationGroup=checkList. 2) Да, ErrorMessage= был удален из пользовательского валидатора. Я попытался поставить точку останова для CodeBehind, и, похоже, она вообще не достигает ее. - person Anthony Gilbert; 26.04.2016
comment
Хорошо, круто, в начале метода кнопки отправки поместите Page.Validate(); вызов, который заставит выполнить метод Required_ServerValidate. Я добавил пример в конце кода выше, который показывает основную идею. - person Scotty; 26.04.2016
comment
К сожалению, добавление Page.Validate() не помогло. Кажется, так далеко не заходит. Может быть проблема в javascript? РЕДАКТИРОВАТЬ: удалена проверка javascript, и она попала в метод проверки на стороне сервера. - person Anthony Gilbert; 26.04.2016