Solución:
Puede usar el atributo RegularExpression, con una expresión regular que coincida con sus criterios. Hay un montón de expresiones aquí que involucran números, estoy seguro de que una de ellas encajará. Aqui esta el link.
Esto lo ayudará a comenzar, aunque es posible que no sea tan inclusivo como desea (requiere al menos un dígito antes del punto decimal):
[RegularExpression(@"d+(.d{1,2})?", ErrorMessage = "Invalid price")]
Tenga en cuenta que es difícil emitir un mensaje de error preciso porque no sabe qué parte de la expresión regular no coincidió (la cadena “z.22” tiene el número correcto de lugares decimales, por ejemplo, pero no es un precio válido ).
[RegularExpression(@"^d+.d{0,2}$",ErrorMessage = "Price can't have more than 2 decimal places")]
public decimal Price { get; set; }
Esto atenderá de 0 a 2 lugares decimales, o ninguno en absoluto.
También puede crear su propio atributo de validación decimal, heredando de RegularExpressionAttribute:
public class DecimalAttribute : RegularExpressionAttribute
{
public int DecimalPlaces { get; set; }
public DecimalAttribute(int decimalPlaces)
: base(string.Format(@"^d*.?d{{0,{0}}}$", decimalPlaces))
{
DecimalPlaces = decimalPlaces;
}
public override string FormatErrorMessage(string name)
{
return string.Format("This number can have maximum {0} decimal places", DecimalPlaces);
}
}
y registrarlo para habilitar la validación del lado del cliente en Application_Start ():
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DecimalAttribute), typeof(RegularExpressionAttributeAdapter));