Обратная связь asp.net предотвращена после проверки клиентской стороны

У меня есть форма asp.net, которая содержит выпадающий список, который отправляет сообщения обратно на сервер при изменении и заполняет второй выпадающий список некоторыми датами.

Форма также содержит другие поля, некоторые из которых являются проверенными на стороне клиента, а некоторые на стороне сервера.

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

Вот моя кнопка отправки:

<asp:Button ID="btnSubmit" Text="Submit" runat="server" OnClientClick="Page_ClientValidate(); return checkPassengers();" OnClick="Page_Transfer" ValidationGroup="FormSubmit" />

Вот моя проверка на стороне клиента:

function checkPassengers() {
    if($("#testField").val() == "Name *" || $("#testField").val() == "") {
            $("#pltester").prepend("<p class='fillall'>Please fill in all fields marked with *</p>");
            return false;       
    }
};

Dropdowns:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" >
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddl1st" EventName="SelectedIndexChanged" />
    </Triggers>
    <ContentTemplate>
        <asp:DropDownList ID="ddl1st" Width="190" AutoPostBack="true" OnSelectedIndexChanged="ChooseDates1st" runat="server" />
        <asp:DropDownList ID="ddlDepart1st" AutoPostBack="true" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

4 ответа

Решение

Я сталкивался с этой проблемой много раз, когда использовал панели обновления.

Я обнаружил, что если поле нужно проверить, то вы должны на самом деле установить CausesValidation="true" на элементе, чтобы он все еще работал с панелями обновления.

Надеюсь, что это помогает вам!

Просто настройка CausesValidation="true" не решил проблему для меня. Это кажется проблемой при использовании события SelectedIndexChange выпадающего списка asp. Обходной путь, который я нашел, состоял в том, чтобы сбросить проверку на внешнем интерфейсе с помощью js путем проверки несуществующего имени группы проверки перед обратной передачей.

function ignoreValidation() {
            if (typeof Page_ClientValidate != 'undefined') {
                Page_ClientValidate('reset-validation');
                Page_BlockSubmit = false;
            }
            return true;
}

И для выпадающего списка

<asp:DropDownList CausesValidation="false" onchange="ignoreValidation();" runat="server" ID="CustomerDropDownList" OnSelectedIndexChanged="LoadCustomers" AutoPostBack="true"/>

Если выпадающий список не нуждается в проверке, вы можете установить CausesValidation="false" в начальном раскрывающемся списке. Это приведет к тому, что он не будет запускать проверку, поэтому он может быть изменен по желанию.

В качестве альтернативы вы можете поместить DropDownList в другую группу ValidationGroup, чтобы ее изменение не вызывало проверку других элементов управления.

function validateCommand(group) {
        if (typeof (Page_ClientValidate) == 'function') {
            Page_ClientValidate(group);
            if (Page_IsValid) {
                Page_BlockSubmit = !confirm('Are you sure?');
            }
        }
    }
Другие вопросы по тегам