web-dev-qa-db-fra.com

MVC 4 - DataAnnotations - Validation pour le type

J'ai le code suivant qui fonctionne

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

Lorsque la page est soumise avec Price = EMPTY Le message d'erreur de champ est "Le prix est requis." . Price = plus de 9999 message d'erreur est "Prix xx.xx".

Cependant, lorsque je tape "aaaa", le message d'erreur est "Le champ productPrice doit être un nombre".

Comment puis-je changer le message si le type n'est pas correct? Comme: "Le prix doit être un nombre décimal/nombre compris entre 1-9999.

---- UPDATE: ---- Le code ci-dessous a fonctionné avec 

NULL, non décimal, entre plage, MAIS ne fonctionne pas avec ".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; }
12
Ravi Ram

Vous pouvez essayer avec l'expression régulière:

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

vous pouvez également essayer les extensions Data Annotations Extensions: http://dataannotationsextensions.org/Home/Wiki

Ou écrivez votre propre implémentation, quelque chose comme ceci: https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

UPDATE Avec REGEX (correspond à 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.")]

Ou en utilisant Range avec une légère modification de la suggestion de @Martin (c'est en fait une meilleure solution):

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

Tout d’abord, je pense que vous voudrez changer votre attribut Range en

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

Selon MSDN, c'est le moyen correct d'utiliser RangeAttribute.

Seconde:

"Le champ productPrice doit être un nombre."

Il s'agit en fait d'une validation JavaScript côté client discrète qui entre en jeu. Votre validateur de plage se déclenchera une fois le numéro validé. Vous pouvez désactiver le validateur de numéro bien que je ne recommande pas ceci:

$.validator.methods.number = function (n, t) {
    return true;
}
5
Martin Devillers

Je pense que vous pouvez trébucher sur un bug dans jQuery. Cette validation combat le contenu émis pour vos attributs de validation.

J'ai la propriété suivante:

[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; }

Utilisé dans une vue comme celle-ci:

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

Juste à elle seule, une valeur "foo" génère mon message d'erreur. Une valeur 0.075 est acceptée. Une valeur de .075 donne "Le champ Valeur doit être un nombre", le même problème que vous semblez avoir.

sur la base de cet article SO , j'ai ajouté ce qui suit dans le document ready:

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

Maintenant, je ne reçois que mon message d'erreur, et seulement lorsque prévu (la valeur .075 est acceptée).

0
Elton