J'ai ceci dans mon modèle de vue:
[Required(ErrorMessage = "Price is required")]
[Range(0.01, 999999999, ErrorMessage = "Price must be greater than 0.00")]
[DisplayName("Price ($)")]
public decimal Price { get; set; }
J'aimerais valider que l'utilisateur n'entre pas plus de 2 décimales. Donc j'aimerais avoir
Valeurs valides : 12, 12.3, 12.34
Valeurs non valides : 12., 12.345
Existe-t-il un moyen de valider cela avec une annotation de données?
Vous pouvez utiliser l'attribut RegularExpression, avec une expression régulière correspondant à vos critères. Il y a beaucoup d'expressions ici qui impliquent des chiffres, je suis sûr que l'une d'entre elles conviendra au projet de loi. Voici le lien .
Cela vous aidera à démarrer, même s’il n’est peut-être pas aussi inclusif que vous le souhaitez (nécessite au moins un chiffre précédant le point décimal):
[RegularExpression(@"\d+(\.\d{1,2})?", ErrorMessage = "Invalid price")]
Notez qu'il est difficile d'émettre un message d'erreur précis car vous ne savez pas quelle partie de l'expression rationnelle n'a pas correspondu (la chaîne "z.22" contient le nombre correct de décimales, par exemple, mais ne représente pas un prix valide. ).
[RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "Price can't have more than 2 decimal places")]
public decimal Price { get; set; }
Cela couvrira de 0 à 2 décimales, voire aucune.
Vous pouvez également créer votre propre attribut de validation Decimal, en héritant 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);
}
}
et enregistrez-le pour activer la validation côté client dans Application_Start ():
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DecimalAttribute), typeof(RegularExpressionAttributeAdapter));
[RegularExpression(@"^\d+(\.\d)?$", ErrorMessage = "It cannot have more than one decimal point value")]
[Range( 0.1,100)]
public double xyz{get;set;}
Cela fonctionne pour moi jusqu'à une valeur décimale
Vous pouvez effectuer cette validation en utilisant une expression régulière et l'appliquer avec l'attribut RegularExpression.
J'ai eu le même scénario que l'OP, mais les réponses fournies ne donnent pas une solution qui fonctionne pour tous les cas suivants:
12, 12.3 and 12.34
Pour ce faire, nous utilisons l'expression régulière suivante:
[RegularExpression(@"^\d+(.\d{1,2})?$")]
Similaire à mattytommo . Tu dois t'échapper '.' - sinon TOUT caractère sera accepté
[RegularExpression(@"^\d+(\.\d{1,2})?$")]