ASP CustomValidator не работает и модал не очищается с экрана - PullRequest
0 голосов
/ 19 сентября 2018

Я добавляю новое поле в форму.Форма используется для обновления статуса с не утвержденного на утвержденный. Цель состоит в том, чтобы убедиться, что если не было внесено никаких изменений, но нажата кнопка обновления, отображается ошибка и обновление не обрабатывается.Это работало до того, как я добавил новое поле и переключился с RequiredFieldValidator на CustomValidator.

Проблема

Теперь, когда не вносятся изменения ввыпадающий список закрывает модальное окно, но остальная часть окна затенена, и приложение, кажется, зависает.

Это немного над моей головой отличный опыт обучения.

РЕДАКТИРОВАТЬ:

Ошибка с консоли

Doc-Comp-Composition-Templates:348 Uncaught TypeError: $(...).ddlCS is not a function
    at ValidateStatusChange_ClientValidate (Doc-Comp-Composition-Templates:348)
    at eval (eval at CustomValidatorEvaluateIsValid (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:450), <anonymous>:1:1)
    at HTMLSpanElement.CustomValidatorEvaluateIsValid [as evaluationfunction] (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:450)
    at ValidatorValidate (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:200)
    at Page_ClientValidate (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:119)
    at Sys$WebForms$PageRequestManager$_doPostBackWithOptions [as _doPostBackWithOptions] (ScriptResource.axd?d=JnUc-DEDOM5KzzVKtsL1tRZpRA_LXrniqfBmVmIZ3cAuPpCW1plWZw2RXdO0zo-BiAzza2U9Udple6pVeaDdyS14EzqQJMs1mhrjSf56Z17-S803UF2Z43EZ-6v-WWTiunEhUO4tmGiISgd0nYLoQNVyt3LQvd2TOLU7l5Fq6n-tE3oJIofGXa6OGTnxPRDQ0&t=fffffffffc18b87d:831)
    at ScriptResource.axd?d=D9drwtSJ4hBA6O8UhT6CQi4RxEM3HXQdD1kANRSxcVDQlciZR3AdFzJCI2OSpEJ8btryaMvtylBgqedQo2VFV1HT2WfhU1dHTVqnIz5ypNeiBiXQQMaUQfmxLJUQguR-W97gIReVDFvaBQUHY7tXxFcflqZ4dU-xR3P7jVPaHdY1&t=fffffffffc18b87d:47
    at HTMLInputElement.onclick (Doc-Comp-Composition-Templates:1)

Управление для проверки:

<div class="form-group">
  <label for="ddlCS">Current Status:</label>
  <asp:DropDownList ID="ddlCS" runat="server" CssClass="form-control" 
    ToolTip="Choose Status" Enabled="false" ValidationGroup="gStatusChange" />
</div>
<div class="form-group">
  <label for="ddlNS">New Status:</label>
  <asp:DropDownList ID="ddlNS" runat="server" CssClass="form-control"
    ToolTip="Choose Status" ValidationGroup="gStatusChange" />
</div>
<div class="form-group">
  <label for="ddlPA">Proof Approval:</label>
  <asp:DropDownList ID="ddlPA" runat="server" CssClass="form-control"
     Tooltip="Choose Proof Status" ValidationGroup="gStatusChange" />
</div>

<div class="col-sm-3">
    <asp:Button ID="btnUpdate" runat="server" Text="Update Status" 
         CssClass="btn btn-primary pull-left" ToolTip="Save Changes" 
         OnClick="btnUpdate_Click"/>
</div>

Валидатор:

<asp:CustomValidator ID="custvStatusChange" runat="server" Display="None" 
      ValidationGroup="gStatusChange"
      ErrorMessage="Wow what an error!"
      OnServerValidate="ValidateStatusChange_ServerValidate"  
      ClientValidationFunction="ValidateStatusChange_ClientValidate"/>
<asp:ValidationSummary ID="vscustvStatusChange" runat="server" ToolTip="Error Summary" 
      ShowSummary="true" 
      ShowMessageBox="false" 
      CssClass="alert alert-danger" 
      ValidationGroup="gStatusChange" />

<Triggers>
     <asp:AsyncPostBackTrigger ControlID="gvTemplates" 
          EventName="RowCommand"/>
     <asp:AsyncPostBackTrigger ControlID="btnUpdate" EventName="Click"/>
</Triggers>

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

protected void ValidateStatusChange_ServerValidate(object source, 
   ServerValidateEventArgs args)
    {
        if (ddlCS.SelectedValue == ddlNS.SelectedValue || ddlPA.SelectedIndex == 0)
        {
            args.IsValid = false;
        }
    }

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

<script>
    $m = jQuery.noConflict();
</script>
<script type="text/javascript">
    function ValidateStatusChange_ClientValidate(source, args) {
        var cStatus = $(source).ddlCS("select").prop("selectedIndex");
        var nStatus = $(source).ddlNS("select").prop("selectedIndex");
        var pStatus = $(source).ddlPA("select").prop("selectedIndex");

        if (cStatus == nStatus || pStatus == 0) {
            args.IsValid = false;
        } else {
            args.IsValid = true;
        }
    }
    function closeModal() {
        $('#modStatus').modal('hide');
        $('body').removeClass('modal-open');
        $('.modal-backdrop').remove();
    }
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest(function () {

        function closeModal() {
            $('#modStatus').modal('hide');
            $('body').removeClass('modal-open');
            $('.modal-backdrop').remove();
        }
    });
 </script>

Событие нажатия кнопки:

protected void btnUpdate_Click(object sender, EventArgs e)
        {
            Page.Validate("custvStatusChange");
            if (Page.IsValid)
            {
                #region Template Status change
                if (ddlNS.SelectedIndex > 0)
                {
                    if (ddlCS.SelectedValue != ddlNS.SelectedValue)
                    {
                        if (ddlCS.SelectedValue == "5" && hfProofStatus.Value == "N")
                        {
                            lblUpdateStatus.Text = "Proof must be approved before template can be";
                            lblUpdateStatus.CssClass = "text-danger";
                        }
                        else
                        {
                            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Close", "$('#modStatus').modal('hide');$('body').removeClass('modal-open');$('.modal-backdrop').remove();", true);
                            // save and notify
                            DotNetAuth auth = (DotNetAuth)HttpContext.Current.Session["AppSysAuth"];
                            if (CompositionTemplate.UpdateStatus(Convert.ToInt32(hfTemplateID.Value),
                                Convert.ToInt32(ddlNS.SelectedValue), auth.Name, hfFileName.Value))
                            {
                                lblUpdateStatus.Text = "Status change saved";
                                lblUpdateStatus.CssClass = "text-success";
                                BindGrid();
                            }
                            else
                            {
                                lblUpdateStatus.Text = "Error saving status change";
                                lblUpdateStatus.CssClass = "text-danger";
                            }
                        }
                    }
                }
                #endregion
            }
        }

1 Ответ

0 голосов
/ 19 сентября 2018

Функция ddlCS() (также с ddlNS() и ddlPA()) не определена, поскольку они не определены в селекторе jQuery $(source).Вам следует изменить эти строки:

var cStatus = $(source).ddlCS("select").prop("selectedIndex");
var nStatus = $(source).ddlNS("select").prop("selectedIndex");
var pStatus = $(source).ddlPA("select").prop("selectedIndex");

на следующие строки, которые используют ClientID для каждого раскрывающегося списка (поскольку вы не используете атрибут ClientIDMode="Static", поэтому предполагается, что динамический идентификатор клиента установлен):

var cStatus = $('#<%= ddlCS.ClientID %>').prop("selectedIndex");
var nStatus = $('#<%= ddlNS.ClientID %>').prop("selectedIndex");
var pStatus = $('#<%= ddlPA.ClientID %>').prop("selectedIndex");

Или с помощью селектора элемента select с атрибутом id, установленным в ClientID каждого раскрывающегося списка, например:

var cStatus = $('select [id=<%= ddlCS.ClientID %>]').prop("selectedIndex");
var nStatus = $('select [id=<%= ddlNS.ClientID %>]').prop("selectedIndex");
var pStatus = $('select [id=<%= ddlPA.ClientID %>]').prop("selectedIndex");
...