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?
Ответы
Ответ 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" внутри текстового поля, чтобы отправить форму, я не думаю, что валидаторы будут препятствовать обратной передаче.