Подтвердить что ты не робот

ASP.net RequiredFieldValidator не препятствует обратной передаче

У меня вопрос о том, что может остановить RequiredFieldValidator от предотвращения обратной передачи.

Я начал работать над более старой, но простой формой aspx, а мой предшественник использовал руководство, проверку на стороне сервера (проверяя, имеют ли какие-то поля формы значение и если не отображают сообщение об ошибке на ярлыке). Я думал, что я вычищу ненужный код и заменим ручную проверку элементами RequiredFieldValidator, но пока они, похоже, проверяют, они не препятствуют обратной передаче. Т.е., я выводил свои сообщения об ошибках, но postback все еще происходит.

Форма довольно проста и нет атрибутов CausesValidation = "false". Мои элементы управления выглядят так:

 <asp:TextBox ID="txtPhone" Runat="server" Columns="20" MaxLength="20" />
 <asp:RequiredFieldValidator ID="rfvPhone" runat="server" Display="Dynamic"
      ErrorMessage="* Required" ControlToValidate="txtPhone" />

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

Существует ли глобальный или проектный параметр, который может вызвать такое поведение? Что-то в файле web.config или global.asax?

4b9b3361

Ответ 1

Уф. Хорошо, я нашел проблему, в основном, создав совершенно новый проект и сравнивая его web.config по очереди с моим старым проектом. Оказывается, виновник таков:

 <xhtmlConformance mode="Legacy"/>

Если я удалю строку, моя проверка будет работать так, как я ожидал. Googling, который обнаружил кучу сообщений в блогах о том, как VisualStudio добавляет эту строку в web.config при обновлении веб-приложений с .net 1.1 до .net 3.5.

Сообщения в блоге в основном жалуются на то, как это поле мешает работе .net AJAX, но я предполагаю, что это противоречит JavaScript, испущенному для RequiredFieldValidator, аналогичным образом.

Ответ 2

Проверка может произойти на клиенте, если он доступен, или на сервере. Задача валидатора заключается не в том, чтобы предотвратить обратную передачу, это для проверки ввода.

Убедитесь, что у вас включен javascript, и попробуйте явно установить для параметра "EnableClientScript" значение true.

В коде не стоит доверять проверке валидаторов на клиенте и всегда использовать "if Page.IsValid".

Ответ 3

У меня была та же проблема, но ответ оказался совсем другим. Я также обновлялся до проверки .NET с жесткой кодировкой на стороне сервера.

Проблема в моем случае оказалась связанной с механизмом перезаписи ASP.NET, используемым в статье MSDN URL-адрес перезаписи в ASP.NET. Использование реализации по умолчанию "Безвентиляторная форма" было виновником - очевидно, это было написано на основе более ранней версии .NET, а JavaScript в форме, которая предотвращала обратную передачу, не отправлялась на вывод, потому что отсутствовал код.

В любом случае, если кто-то еще использует этот механизм перезаписи, решение заключалось в изменении реализации ActionlessForm по умолчанию на следующее:

Public Class Form
    Inherits System.Web.UI.HtmlControls.HtmlForm

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(New ActionlessFormHtmlTextWriter(writer))
    End Sub

End Class

Public Class ActionlessFormHtmlTextWriter
    Inherits HtmlTextWriter

    Sub New(ByVal writer As HtmlTextWriter)
        MyBase.New(writer)
        Me.InnerWriter = writer.InnerWriter
    End Sub

    Sub New(ByVal writer As System.IO.TextWriter)
        MyBase.New(writer)
        MyBase.InnerWriter = writer
    End Sub

    Public Overrides Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal fEncode As Boolean)

        Dim Context As HttpContext = HttpContext.Current

        'Skip the action attribute of the form control.
        If Not (name = "action") OrElse Not Context.Items("ActionAlreadyWritten") Is Nothing Then

            MyBase.WriteAttribute(name, value, fEncode)

        Else
            Context.Items("ActionAlreadyWritten") = True
        End If
    End Sub

End Class

То, что это делает, просто подавляет атрибут действия, но позволяет запускать любую другую логику в среде. Это должно в будущем доказать это, если Microsoft решит снова изменить форму.

Ответ 4

Не можете ли вы попробовать явный параметр EnableClientScript="True" для RequiredFieldValidator?

Ответ 5

Если вы нажмете "Enter" внутри текстового поля, чтобы отправить форму, я не думаю, что валидаторы будут препятствовать обратной передаче.