2012-08-28 23 views
12

he el siguiente código de trabajoMVC 4 - DataAnnotations - Validación de Tipo

[Required(ErrorMessage = "Price is required.")] 
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price xx.xx")] 
    public decimal? productPrice { get; set; } 

Cuando la página se presenta con Precio = mensaje de error de campo vacío es "se requiere de precio.". Precio = más de 9999 mensaje de error es "Precio xx.xx".

Sin embargo, cuando escribo 'aaaa' el mensaje de error es "El campo productPrice debe ser un número."

¿Cómo puedo cambiar el mensaje si el tipo no es correcto? Al igual que :. "El precio debe ser un decimal/número entre 1-9999

---- ACTUALIZACIÓN: ---- El código siguiente trabajó con

NULL, no decimal, entre la gama, pero no se trabaja con" 0.1"

[Required(ErrorMessage = "Price is required.")] 
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Price must be a Numbers only.")] 
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price must be a decimal/number between {1} and {2}.")] 
    public decimal? productPrice { get; set; } 

Respuesta

12

usted puede tratar con la expresión regular:.

[RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "{0} must be a Number.")] 

que ca n también tratar las extensiones de anotaciones de datos: http://dataannotationsextensions.org/Home/Wiki

O escribir su propia implementación, algo como esto: https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

ACTUALIZACIÓN Con Regex (Partidos $ 9,999.99 | $ 0.70 | .1)

[RegularExpression(@"^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$", ErrorMessage = "{0} must be a Number.")] 

O de una animación con una ligera modificación a la sugerencia @ Martin (en realidad es una mejor solución):

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")] 
+2

Esta expresión regular fallará en varios casos como ".1" No recomiendo usar expresiones regulares para hacer un crujido de números. las expresiones regulares están pensadas para hacer coincidir las cadenas de texto (entradas). RangeAttribute es la forma más adecuada de resolver este problema. –

+0

@JOBG como dijo Martin, ".1" NO está siendo capturado por ninguna de las (3) Anotaciones de datos. ¿Alguna idea? –

+0

Simplemente cambie el método de Rango de @MartinDevillers de 1-999 a 0-999 y debería dejar pasar ".1", como dije en realidad, Range es una mejor solución. También agregué una expresión regular en caso de que quiera verificar eso. – JOBG

5

En primer lugar, creo que tendrá que cambiar su atributo rango de

[Range(typeof(Decimal), "1", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")] 

According to MSDN, esta es la forma válida para utilizar RangeAttribute.

Segundo:

"El productPrice campo debe ser un número."

Esto es en realidad una validación de JavaScript discreta del lado del cliente que entra en juego. Su validador de rango se activará después de que el número haya sido validado. Puede desactivar el validador número aunque no recomiendo esto:

$.validator.methods.number = function (n, t) { 
    return true; 
} 
+0

Esto no validará las cadenas con el dígito inicial 0, como 0007, 0500 – mko

0

Creo que es posible que se tropiece con un error en jQuery. Esa validación es luchar contra las cosas emitidas por sus atributos de validación.

que tienen la siguiente propiedad:

[Display(ResourceType = typeof(TaxSetupResources), Name = "Model_Value")] 
[RegularExpression(@"(^\d+$)|(^\.\d{1,4}$)|(^\d*\.\d{0,4}$)", ErrorMessageResourceName="Model_InvalidFormatForAmount", ErrorMessageResourceType=typeof(TaxSetupResources))] 
public decimal? Value { get; set; } 

utiliza en una vista como esta:

<div> 
    @Html.TextBoxFor(t => t.Tiers[i].Value, new { title = @Resources.TaxSetupResources.Model_ValueTip }) 
    <br />@Html.ValidationMessageFor(t => t.Tiers[i].Value) 
</div> 

sólo por sí mismo, un valor "foo" produce mi mensaje de error. Se acepta un valor de 0.075. Un valor de .075 produce "El campo Valor debe ser un número", el mismo problema que parece tener.

basado en this SO article, que añade el texto siguiente documento listo:

$(function() { 
    $.validator.methods.number = function (value, element) { 
     return parseFloat(value).toString() !== "NaN"; 
    } 
}); 

Ahora solo me dan mi mensaje de error, y sólo cuando se esperaba (.075 es aceptada).

Cuestiones relacionadas