net mvc for custom bootstrap asp asp.net validation

asp.net - for - mvc required field validation



ASP.net RequiredFieldValidator no impide la devoluciĆ³n de datos (5)

Tengo una pregunta sobre qué podría evitar que RequiredFieldValidator evite una devolución de datos.

Comencé a trabajar en un formulario aspx más antiguo pero simple, y mi predecesor utilizó la validación de formulario manual del lado del servidor (verificando si algunos campos de formulario tienen un valor y si no muestran un mensaje de error en una etiqueta). Pensé que limpiaría algún código innecesario y reemplazaría la comprobación manual con los controles RequiredFieldValidator, pero aunque parecen estar validando, no impiden una devolución de datos. Es decir, me aparecen mis mensajes de error pero la devolución de datos todavía ocurre.

El formulario es bastante simple y no hay atributos CausesValidation = "false" establecidos. Mis controles se ven así:

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

Creé un nuevo formulario web en el mismo proyecto con solo un cuadro de texto, validador y botón de enviar y actúa de la misma manera. Aparece un mensaje de error, pero aún se produce una devolución de datos.

¿Hay una configuración global o de todo el proyecto que pueda causar este comportamiento? Algo en el web.config o global.asax?


La validación puede ocurrir en el cliente si está disponible, o en el servidor. El trabajo del validador no es evitar una devolución de datos, es validar la entrada.

Asegúrese de tener javascript habilitado e intente establecer explícitamente "EnableClientScript" en verdadero.

En el código subyacente, nunca debe confiar en que los validadores estén validando en el cliente, y siempre use "if Page.IsValid" .


Si presiona "Enter" dentro de un cuadro de texto para enviar el formulario, no creo que los validadores impidan la devolución de datos.


Uf. De acuerdo, encontré el problema, básicamente creando un nuevo proyecto y comparando su web.config línea por línea con mi proyecto anterior. Resulta que el culpable es esto:

<xhtmlConformance mode="Legacy"/>

Si elimino la línea, mi validación funciona de la manera que esperaba. Google que descubrió un montón de publicaciones de blog sobre cómo VisualStudio agrega esa línea a web.config al actualizar aplicaciones web de .net 1.1 a .net 3.5.

Las publicaciones del blog se quejaban principalmente de cómo ese campo interfiere con el material AJAX de .net, pero supongo que se mezcla con el JavaScript emitido para RequiredFieldValidator de una manera similar.


Tuve el mismo problema, pero la respuesta resultó ser bastante diferente. También estaba actualizando a la validación de .NET desde la validación de código duro del lado del servidor.

El problema en mi caso resultó estar relacionado con el motor de reescritura de ASP.NET utilizado desde la reescritura de URL del artículo de MSDN en ASP.NET . Usar la implementación predeterminada del "Formulario sin acción" fue el culpable, aparentemente este fue escrito basado en una versión anterior de .NET y el JavaScript en el formulario que impedía que la devolución de datos no se enviara a la salida porque faltaba el código .

De todos modos, en caso de que alguien más esté usando este motor de reescritura, la solución fue cambiar la implementación predeterminada de ActionlessForm a lo siguiente:

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

Lo que hace es simplemente suprimir el atributo de acción, pero permite que se ejecute cualquier otra lógica en el marco. Esto debería ser una prueba futura de esto en caso de que Microsoft decida cambiar el formulario nuevamente.


¿Podría probar un EnableClientScript="True" explícito EnableClientScript="True" para RequiredFieldValidator?