customvalidator для выпадающего списка не вызывается (очевидно)

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

Примечание. Я не использовал ControlToValidate.

asp.net:

     <asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional" Visible="true" RenderMode="Inline">
        <ContentTemplate>
        <asp:DropDownList ID="ddlCommandAssign" runat="server" AutoPostBack="true">
        </asp:DropDownList>
          <asp:CustomValidator id="val_command_assigned" runat="server"  
          ErrorMessage="* " 
          display="Static"
          OnServerValidate="commandAssigned" 
          />
                </ContentTemplate>
       <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ddlCommandAssign" 
                EventName="SelectedIndexChanged" />
        </Triggers>

    </asp:UpdatePanel>

За кодом:

Sub commandAssigned(ByVal source As Object, _
  ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs)

    Dim s As String
    s = ddlCommandAssign.SelectedValue
    'if s = "1" then 
    '  args.IsValid = true
    'else
    '  args.IsValid = False
    'end if
    args.IsValid = False
End Sub

В целях отладки я хочу, чтобы он каждый раз терпел неудачу.

Кажется, он вообще не выполняет код позади.

Для отладки я добавил строку response.redirect("dummy.html") ..., которая никогда не вызывается, что также указывает (я думаю), что валидатор никогда не вызывается.


person elbillaf    schedule 30.06.2011    source источник
comment
Я также добавил ValidateEmptyText=true в валидатор. Все равно не повезло.   -  person elbillaf    schedule 30.06.2011
comment
Важно ли для вас, чтобы это подтверждалось через постбэк? Вы против того, чтобы делать это на стороне клиента? Кроме того, есть ли причина, по которой вы не используете ControlToValidate. Я заметил, что вы этого не сделали, как вы сказали, но я не уверен, почему.   -  person Precious Roy    schedule 30.06.2011
comment
Я меняю раскрывающийся список на основе значения, которое пользователь выбирает первым. (Я ненавижу это, но пользователи привыкли к тому, как работает старая система.) Я думаю, мне нужно использовать автопостбэк для обновления ddl после того, как я его изменю. Пробовал с контролем и без него проверить. Я пробовал без, основываясь на информации, которую я прочитал на полудюжине сайтов. (Не знаю, насколько надежен этот совет, но я обычно предполагаю, что парень, который заставил его работать, знает что-то, чего не знаю я.)   -  person elbillaf    schedule 30.06.2011


Ответы (3)


Удалите панель обновления и попробуйте выполнить проверку на стороне клиента с помощью javascript.

ПРОВЕРКА НА СТОРОНЕ КЛИЕНТА

определение события JavaScript,

 function ValidateFunction(sender,args) 
 {
   var ddlCommandAssign= document.getElementById('<%=ddlCommandAssign.ClientID %>');
    if (ddlCommandAssign.options[control.selectedIndex].value=='0') 
    {  args.IsValid = false;//This shows the validation error message and stops execution at client side itself.}
  else { args.IsValid = true;//This will return to the server side. }    
 }

Раздел Aspx:

  <asp:DropDownList ID="DropDownList1" runat="server">
        <asp:ListItem Value="1">select</asp:ListItem>
        <asp:ListItem Value="2">sdasda</asp:ListItem>
    </asp:DropDownList>
    <asp:CustomValidator ID="valCustmID" runat="server" ErrorMessage="*" ForeColor="Red"
        ValidationGroup="group1" ClientValidationFunction="ValidateFunction"></asp:CustomValidator>
    <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1" />

ПРИМЕЧАНИЕ. Пользовательский валидатор и триггерная кнопка должны иметь одну и ту же группу проверки.

ПРОВЕРКА НА СЕРВЕРЕ

Если вам действительно нужна сторона сервера проверки, см. код ниже:

     <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:DropDownList ID="DropDownList1" runat="server">
                <asp:ListItem Value="1">select</asp:ListItem>
                <asp:ListItem Value="2">sdasda</asp:ListItem>
            </asp:DropDownList>
            <asp:CustomValidator ID="CustomValidator1" OnServerValidate="commandAssigned" runat="server" ErrorMessage="*" ValidationGroup="group1"></asp:CustomValidator>
            <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1" />
        </ContentTemplate>
    </asp:UpdatePanel>

ПРИМЕЧАНИЕ. Пользовательский валидатор и триггерная кнопка должны иметь одну и ту же группу проверки.

код события выглядит следующим образом:

    protected void commandAssigned(object source, ServerValidateEventArgs args)
    {
        if (DropDownList1.SelectedItem.Value == "1")            
            args.IsValid = false;  //since you gave controlToValidate="DropDownList1"  this will display the error message.       
        else           
            args.IsValid = true;            
    }

Надеюсь это поможет..

person Harun    schedule 30.06.2011
comment
Вы не должны никогда полагаться только на клиентский код для выполнения проверки. Вы можете использовать его в сочетании с проверкой на стороне сервера, если хотите, но вы все равно должны проверять на стороне сервера во всех случаях. - person Frédéric Hamidi; 30.06.2011
comment
Попробую. Я использую панель обновления, потому что я меняю ddl на лету (для пользователей, приверженных устаревшей версии, которую я заменяю) - и я думал, что мне нужно, чтобы панель обновления отображалась повторно, но я сделаю, как вы предлагаете, и посмотрю, что бывает. Спасибо - person elbillaf; 30.06.2011
comment
Фредерик, спасибо за дополнение к этому. Я буду иметь это в виду и буду работать над решением на стороне сервера, но я все же собираюсь попробовать его решение, чтобы посмотреть, приблизит ли оно меня. Я в отчаянии. - person elbillaf; 30.06.2011
comment
Харун, извини, что так долго. Я пробовал. Все еще не работает. Но спасибо. Я признателен за это. - person elbillaf; 30.06.2011
comment
@ХАРУН! Прежде чем использовать ваш код, я решил просто добавить параметр ValidationGroup из вашего кода, и это сработало! У меня есть еще несколько тестов, но это выглядит хорошо! Большое спасибо вам обоим, ребята! (и я собираюсь прочитать об этом бизнесе группы проверки!) - person elbillaf; 30.06.2011
comment
@TheFallibleFiend, только выпадающий список с AutoPostBack, для которого установлено значение true, не запускает события пользовательского валидатора OnServerValidate/ClientValidationFunction. Для их запуска требуется кнопка с той же группой проверки, что и у customValidator. В любом случае я обновил свой ответ обоими решениями. Но лучше избегать панели обновления ajax, потому что она вызывает проблемы с производительностью, а также другие неожиданные проблемы. - person Harun; 30.06.2011
comment
Еще одна небольшая проблема... Я только что заметил, что теперь другие поля не проверяются... попробую поместить их все в группу проверки 1. Я повторю решение без AJAX. Благодарю. - person elbillaf; 30.06.2011
comment
Хммм... Я заметил, что когда я добавляю несколько валидаторов в группу 1, они работают не с ddl, а не с ddl. когда я установлю их правильно, он сообщит о недопустимом ddl. Я собираюсь попробовать снова удалить ajax, чтобы посмотреть, поможет ли это. - person elbillaf; 30.06.2011
comment
Если я понимаю вопрос, то нет. - person elbillaf; 30.06.2011
comment
Вызвал ли AutoPostBack=true вместе с той же группой проверки, что и настраиваемый валидатор для раскрывающегося списка без кнопки, ваше событие OnServerValidate? Если вы все еще не поняли, что я имел в виду, пожалуйста, отправьте свой вопрос. - person Harun; 30.06.2011
comment
Хорошо. Я понимаю. Ответ - нет. - person elbillaf; 30.06.2011

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

person vakas    schedule 22.10.2011

Вы должны указать элемент управления для проверки с помощью ControlToValidate:

<asp:CustomValidator id="val_command_assigned" runat="server"
    ErrorMessage="* " Display="Static" OnServerValidate="commandAssigned"
    ControlToValidate="ddlCommandAssign" />

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

person Frédéric Hamidi    schedule 30.06.2011
comment
Спасибо за ответ. Я начинал именно с этого, но не получилось. ОДНАКО, я попробовал еще раз только сейчас, чтобы убедиться. Все еще не работает. Я удалил его, потому что нашел ряд ссылок, в которых говорилось, что проверка не будет вызываться, если элемент управления возвращает пустую строку. (Это было раньше, но я изменил его.) - person elbillaf; 30.06.2011
comment
@TheFallibleFiend, я не думаю, что ограничение на пустую строку в любом случае распространяется на пользовательские валидаторы. Вызывается ли обработчик, если вы временно удаляете UpdatePanel? - person Frédéric Hamidi; 30.06.2011
comment
Я только что попробовал - но он все еще не срабатывает даже после того, как я удалил панель обновления. Я должен был подумать о том, чтобы попробовать это раньше. - person elbillaf; 30.06.2011
comment
@TheFallibleFiend, вы не устанавливаете для свойства Enabled или Visible валидатора значение false и не устанавливаете группу проверки в своем коде, верно? - person Frédéric Hamidi; 30.06.2011