Int ou Number DataType pour l'attribut de validation DataAnnotation

111

Sur mon projet MVC3, je stocke la prédiction de score pour le football / soccer / hockey / ... jeu de sport. Donc, l'une des propriétés de ma classe de prédiction ressemble à ceci:

[Range(0, 15, ErrorMessage = "Can only be between 0 .. 15")]
[StringLength(2, ErrorMessage = "Max 2 digits")]
[Remote("PredictionOK", "Predict", ErrorMessage = "Prediction can only be a number in range 0 .. 15")]
public int? HomeTeamPrediction { get; set; }

Maintenant, je dois également modifier le message d'erreur pour un type de données, intdans mon cas. Une valeur par défaut est utilisée - "Le champ HomeTeamPrediction doit être un nombre.". Besoin de trouver un moyen de modifier ce message d'erreur. Ce message de validation semble également prendre la prédiction pour une validation à distance.

J'ai essayé l' [DataType]attribut mais cela ne semble pas être un nombre simple dans l' system.componentmodel.dataannotations.datatypeénumération.

Antonin Jelinek
la source

Réponses:

221

Pour toute validation de numéro, vous devez utiliser une validation de plage différente selon vos besoins:

Pour un entier

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

pour flotteur

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

pour double

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]
Dilip0165
la source
4
Cela n'a pas fonctionné pour moi dans mon contexte. Si l'utilisateur entre "asdf", [Range (typeof (decimal), "0", "9999.99", ErrorMessage = "La valeur de {0} doit être comprise entre {1} et {2}")] lève une exception. Cependant, si je fais [Range (typeof (decimal), "0.1", "9999.99", ErrorMessage = "La valeur pour {0} doit être comprise entre {1} et {2}")], le message d'erreur fonctionnera correctement. 0 contre 0,1, n'a aucun sens. bug peut-être?
meffect le
1
Cette validation "entière" traite les valeurs non entières comme valides (par exemple 0,3)
kevinpo
77

Essayez l'une de ces expressions régulières:

// for numbers that need to start with a zero
[RegularExpression("([0-9]+)")] 


// for numbers that begin from 1
[RegularExpression("([1-9][0-9]*)")] 

j'espère que cela aide: D

Goran Žuri
la source
13
N'y a-t-il pas un moyen plus simple? J'espère quelque chose comme: [Numeric (ErrorMessage = "Ce champ doit être un nombre")]
Banford
3
Malheureusement non. Vous pouvez toujours écrire votre propre attribut de validation.
Goran Žuri
2
C'est la meilleure solution, car elle couvre les chaînes. int.MaxValuene couvre que jusqu'au2.147.483.647
Christian Gollhardt
19

Utiliser l'expression régulière dans l'annotation de données

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }
Sathish
la source
2
Cela semble fonctionner correctement dans le contexte de la question, à condition que la propriété ne soit pas un int, mais une chaîne.
Paul
1
Pourquoi la parenthèse autour de l'expression régulière? Serait-ce juste [0-9]+?
polkduran
5
public class IsNumericAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            decimal val;
            var isNumeric = decimal.TryParse(value.ToString(), out val);

            if (!isNumeric)
            {                   
                return new ValidationResult("Must be numeric");                    
            }
        }

        return ValidationResult.Success;
    }
}
stuartdotnet
la source
5

Essayez cet attribut:

public class NumericAttribute : ValidationAttribute, IClientValidatable {

    public override bool IsValid(object value) {
        return value.ToString().All(c => (c >= '0' && c <= '9') || c == '-' || c == ' ');
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "numeric"
        };
        yield return rule;
    }
}

Et vous devez également enregistrer l'attribut dans le plugin de validation:

if($.validator){
     $.validator.unobtrusive.adapters.add(
        'numeric', [], function (options) {
            options.rules['numeric'] = options.params;
            options.messages['numeric'] = options.message;
        }
    );
}
Stefan Turcanu
la source
0

près d'une décennie s'est écoulée, mais le problème est toujours d'actualité avec Asp.Net Core 2.2.

Je l'ai géré en ajoutant data-val-numberau champ de saisie la localisation d'utilisation sur le message:

<input asp-for="Age" data-val-number="@_localize["Please enter a valid number."]"/>
Laz Ziya
la source
0

ASP.NET Core 3.1

Ceci est ma mise en œuvre de la fonctionnalité, cela fonctionne côté serveur ainsi qu'avec la validation jquery discrète avec un message d'erreur personnalisé comme tout autre attribut:

L'attribut:

  [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class MustBeIntegerAttribute : ValidationAttribute, IClientModelValidator
    {
        public void AddValidation(ClientModelValidationContext context)
        {
            MergeAttribute(context.Attributes, "data-val", "true");
            var errorMsg = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
            MergeAttribute(context.Attributes, "data-val-mustbeinteger", errorMsg);
        }

        public override bool IsValid(object value)
        {
            return int.TryParse(value?.ToString() ?? "", out int newVal);
        }

        private bool MergeAttribute(
              IDictionary<string, string> attributes,
              string key,
              string value)
        {
            if (attributes.ContainsKey(key))
            {
                return false;
            }
            attributes.Add(key, value);
            return true;
        }
    }

Logique côté client:

$.validator.addMethod("mustbeinteger",
    function (value, element, parameters) {
        return !isNaN(parseInt(value)) && isFinite(value);
    });

$.validator.unobtrusive.adapters.add("mustbeinteger", [], function (options) {
    options.rules.mustbeinteger = {};
    options.messages["mustbeinteger"] = options.message;
});

Et enfin l' utilisation:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
HMZ
la source