I have the following code working
[Required(ErrorMessage = \"Price is required.\")]
[Range(typeof(Decimal), \"1\", \"9999\", ErrorMessage = \"Price xx.xx
First off, I think you will want to change your Range attribute to
[Range(typeof(Decimal), "1", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]
According to MSDN, this is the valid way to use RangeAttribute.
Second:
"The field productPrice must be a number."
This is actually unobtrusive client-side JavaScript validation kicking in. Your range validator will fire after the number has been validated. You can disable the number validator although I do not recommend this:
$.validator.methods.number = function (n, t) {
return true;
}