2011-07-19 11 views
5

Tengo una página con un CompareValidator en él:de error intermitente con CompareValidator - propiedad ValueToCompare es ""

<asp:textbox id="txtResponseDate" runat="server" /> 
<asp:requiredfieldvalidator id="rfvResponseDate" runat="server" 
         controltovalidate="txtResponseDate" 
         display="Dynamic" 
         errormessage="Date is required." 
         setfocusonerror="true"> 
        </asp:requiredfieldvalidator> 
<asp:comparevalidator id="cmvDate" runat="server" 
         controltovalidate="txtResponseDate" 
         display="Dynamic" 
         errormessage="Date must not be before today." 
         operator="GreaterThanEqual" 
         setfocusonerror="true" 
         type="Date"> 
        </asp:comparevalidator> 

En el código subyacente, establecemos la propiedad ValueToCompare así:

If Not IsPostBack Then 

    cmvDate.ValueToCompare = DateTime.Now.ToString("d") 

End If 

De forma intermitente (no podemos discernir un patrón), obtenemos el siguiente error:

"El valor '' de la propiedad ValueToCompare de 'cmvDate' no se puede convertir a tipo 'Fecha'."

Con una pila de llamadas de:

at System.Web.UI.WebControls.CompareValidator.ControlPropertiesValid() 
at System.Web.UI.WebControls.BaseValidator.get_PropertiesValid() 
at System.Web.UI.WebControls.BaseValidator.Validate() 
at System.Web.UI.Page.Validate() 
at System.Web.UI.Page.Validate(String validationGroup) 
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 

Mi primer pensamiento fue algo extraño con el formato de fecha, pero estamos usando las fechas del Reino Unido, último error fue el 18 de julio, por lo que el ValueToCompare consigue el sistema a 18/07/2011. Lo configuré manualmente usando el depurador, y funcionó bien. ¿Alguien tiene ideas brillantes sobre por qué esto puede estar pasando?

  1. He comprobado el código - no hay ningún otro lugar en el que se establezca esto.
  2. Utilizando el depurador, he comprobado dos veces en la devolución de datos, y como se esperaba, este valor de propiedad se conserva.
+0

¿Cuál es su 'CurrentCulture'? – VMAtm

+0

¿Recibió el texto y luego se produjo el error? – VMAtm

+0

@VMAtm - Nuestra cultura es en-UK, y no, no tenemos el texto. – Paddy

Respuesta

5

The value '' of the ValueToCompare property of 'cmvDate' cannot be converted to type 'Date'.

Este mensaje de error dice, que en un momento de la validación de la propiedad ValueToCompare de su RangeValidator en sí (no el control está validando) no está establecido. Esto puede ser si usted escribió estas líneas:

If Not IsPostBack Then 
    cmvDate.ValueToCompare = DateTime.Now.ToString("d") 
End If 

no en Page_Init evento.

  1. mover el código de ajuste de la ValueToCompare a la Init event, con la eliminación del cheque de devolución de datos.
  2. Compruebe qué valor tiene esta propiedad durante la verificación de los datos (puede eliminar el cheque de Not IsPostBack).
  3. Establezca esta propiedad antes de que se realice la comprobación.
+0

Ninguno de estos explica por qué todo esto funciona la mayor parte del tiempo, y solo falla intermitentemente. – Paddy

+0

No dijiste que tu código funcionaba a veces. No contó sobre la información de depuración, qué 'valueToCompare' tiene su validador. Ya lo he explicado, cuando su código * puede * fallar, en el momento de la validación, si no configuró el 'valorToCompare'. – VMAtm

+0

Agradezco la ayuda, pero suplico diferir, esto es todo en la pregunta original. – Paddy

1

¿Estás obteniendo algún otro error relacionado con ViewState? Como "Error de validación de viewstate MAC. Si esta aplicación está alojada en una Web Farm o clúster, asegúrese de que la configuración <machineKey> especifique la misma validaciónKeyKey y algoritmo de validación. AutoGenerate no se puede usar en un clúster"?

Si es así, tal vez el problema esté relacionado con una de las cosas enumeradas en este MS KB article: Intermittent Invalid Viewstate Error in ASP.NET Web pages.

There are several conditions that may cause this issue. Each known condition is presented with a short explanation and a possible workaround.
Application Pool Recycling
Server Farms or Server Clusters
Form Posts
Proxy servers and Virus Scanners

Otra cosa es posible que no se menciona en ese artículo es una conexión lenta o poco fiable junto con el resultado de la impaciencia de los usuarios. Trabajé en una aplicación alojada en EE. UU. Pero muchos usuarios son de India. Notamos una frecuencia mucho mayor de estos tipos de errores intermitentes relacionados con ViewState entre los usuarios en India. Especulamos que podría haber sido debido a una mayor latencia, mayor cantidad de saltos, menor ancho de banda y usuarios que interactúan con las páginas antes de completar la carga de la página.

+0

Gracias por la respuesta: trabajamos en una granja de servidores web, pero ya estamos configurados para que coincidan las claves de máquina en todos los sitios, y ya no obtenemos estos errores de tipo de estado de visualización. Es muy posible que esto esté relacionado de alguna manera, pero lo extraño es que solo hay una página en la aplicación donde esto está sucediendo actualmente. – Paddy

2

En la configuración de control se establece type="Date" générale significa que va a comparar el valor como un objeto DateTime, pero en la propiedad ValueToCompare configura string objeto, no una DateTime.

Si es necesario comparar por cuerdas - establecer el control de la configuración type a String, Si es necesario comparar fechas de caducidad - set DateTime objeto a la propiedad ValueToCompare control y Operator="DataTypeCheck".

Cuestiones relacionadas