2011-03-23 26 views
8

Tengo una página ASP.NET bastante simple con algunos campos de entrada y validadores. Uno de los campos de aceptar un doble aspecto siguiente:ASP.NET RangeValidator rareza con MaximumValue

<asp:TextBox ID="tbHeight" runat="server" /> 
<asp:RangeValidator ID="vdHeight" runat="server" 
    ErrorMessage="Height must be a positive number" Text="*" 
    ControlToValidate="tbHeight" MinimumValue="0" Type="Double" /> 

esto funciona como se esperaba, y el usuario debe introducir un número de> = 0.
Actualización: esto no funciona como se esperaba después de todo (algunos extraño error en el proyecto). Véanse los comentarios a las respuestas a continuación para más detalles

que vuelva a intentar la misma para un campo de aceptar un entero:

<asp:TextBox ID="tbGrossTonnage" runat="server" /> 
<asp:RangeValidator ID="vdGrossTonnage" runat="server" 
    ErrorMessage="Gross Tonnage must be a positive whole number" Text="*" 
    ControlToValidate="tbGrossTonnage" MinimumValue="0" Type="Integer" /> 

Al cargar la página ASP, esto me da el siguiente error: El valor ' 'de la propiedad MaximumValue de' vdGrossTonnage 'no se puede convertir a tipo' Integer '.

no tengo ningún requisito específico de valor máximo en el sistema, por lo que lo haría al igual que en "default" para Int32.MaxValue (aunque tendría que introducir 2147483647, ya MaximumValue no parece aceptar la Int32.MaxValue constante).

Por qué es que un RangeValidator del tipo Integer no aceptará una falta MaximumValue propiedad, pero para uno de los tipos Double esto está bien?

Respuesta

15

Las propiedades MinimumValue y MaximumValue de la clase RangeValidator devuelven string.Empty como valor predeterminado cuando no están establecidas.

A continuación, también ocurre que el Convert() método protegido ejecutado por BaseCompareValidator, que se utiliza para convertir las propiedades de cadena a los valores, llama int.Parse() para el caso ValidationDataType.Integer. int.Parse() no le gusta la cadena vacía y lanzará una excepción.

Pero, en el caso de ValidationDataType.Double, Convert() primeras llama a otro método protegido, ConvertDouble() (en lugar de double.Parse()), y en ese método que devuelve explícitamente un valor de cadena de "0" cuando se detecta una cadena vacía, y ese valor de cadena "0" más tarde analiza, a través de double.Parse() en 0d.

El caso entero no se beneficia de tal mapeo de string.Empty a "0".

Por lo tanto, la discrepancia. El diablo está en los detalles, y Reflector es tu amigo.

+0

Solo un pequeño seguimiento: en el caso de que omita 'MaximumValue' para el tipo doble, esto significaría que tanto min como max son 0. ¿Por qué entonces mi página valida el campo correctamente? (-1 no es válido, y 1 es válido (lo he verificado dos veces, y esto realmente funciona))? – Nailuj

+0

@Nailuj No puedo corroborar su conclusión de que la página se valida correctamente con "1" como entrada. Si dejo caer sus controles (desde su primer fragmento arriba) a una nueva página en un proyecto de sitio web vacío, ingresando "1" y luego causando la devolución de datos (agregué un botón) * no * causa falla de validación. –

+0

No valida correctamente. –

0

Es una buena práctica especificar MaximumValue para el RangeValidator, incluso si sus requisitos no lo requieren específicamente. En ese caso, solo use el MaxValue para el Type. El valor predeterminado para MaximumValue es String.Empty.

1

Dejar el espacio en blanco de MaximumValue en Type = "Double" equivale a establecer MaximumValue en 0. No estoy seguro de que tenga razón sobre que el primero de sus ejemplos funciona bien.

+0

Sí, estoy * seguro * mi primer ejemplo funciona bien. He verificado esto dos veces (ver mi comentario a la respuesta de Chris W. Rea). – Nailuj

+0

@Nailuj Probé tu ejemplo y no funcionó bien. (Consulte mi comentario anterior.) ¿Puede intentar nuevamente en el caso reducido más simple posible, fuera de su aplicación, en un nuevo proyecto de sitio web, como lo hice? Tal vez hay otro código de su aplicación que interfiere. p.ej. ¿Habilita/deshabilita selectivamente cualquiera de sus validadores? etc. –

+0

@Chris W. Rea: Intenté con un nuevo proyecto ASP.NET, y en este caso obtuve el mismo resultado que usted: la validación * no * funciona bien. No puedo pensar en nada obvio en mi otra aplicación que pueda causar esto tampoco ... Pero en realidad no importa, solo me aseguraré de especificar explícitamente el valor mínimo y máximo. Gracias por tomarse el tiempo para probarlo :) – Nailuj

0

Solo para hacerlo más confuso ..

En mi formview (que se encuentra en un UpdatePanel si hay alguna diferencia) tengo ..

<div class="Width100PercentPadded"> 
    <div class="Width40PercentPadded FloatLeft ClearLeft"> 
     Latitude: 
    </div> 
    <div class="Width60PercentPadded FloatLeft"> 
     <asp:TextBox runat="server" ID="txtLatitude" CssClass="Width100Percent" Text='<%#  Bind("Latitude") %>' ></asp:TextBox> 
     <asp:CompareValidator ID="CompareValidatorLatitude" runat="server" ControlToValidate="txtLatitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Latitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator> 
     <asp:RangeValidator ID="RangeValidatorLatitude" runat="server" ControlToValidate="txtLatitude" MinimumValue="0" MaximumValue="90" ErrorMessage="Latitude in range 0 to 90" Text="range 0 to 90" ForeColor="Red" Display="Dynamic"></asp:RangeValidator> 
    </div> 
</div> 

<div class="Width100PercentPadded"> 
    <div class="Width40PercentPadded FloatLeft ClearLeft"> 
     Longitude: 
    </div> 
    <div class="Width60PercentPadded FloatLeft"> 
     <asp:TextBox runat="server" ID="txtLongitude" CssClass="Width100Percent" Text='<%# Bind("Longitude") %>'></asp:TextBox> 
     <asp:CompareValidator ID="CompareValidatorLongitude" runat="server" ControlToValidate="txtLongitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Longitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator> 
     <asp:RangeValidator ID="RangeValidatorLongitude" runat="server" ControlToValidate="txtLongitude" MinimumValue="0" MaximumValue="180" ErrorMessage="Longitude in range 0 to 180" Text="range 0 to 180" ForeColor="Red" Display="Dynamic"></asp:RangeValidator> 

    </div> 
</div> 

Nota mi latitud y longitud de validación es esencialmente el mismo, excepto Longitud permite una maxvalue superior.

Cuando se ejecuta, Longitud se valida exactamente como se esperaba - tipo debe ser numérico y el valor debe estar entre 0 y 180.

tipo de latitud debe ser numérico, y el rango de error si el valor es negativo, pero el no es maxvalue comprobado. Puedo poner valores en millones en el cuadro de texto y la validación no falla.

Cuestiones relacionadas